: содержит селектор с Selenium и Select2

0

Я знаю, что Selenium поддерживает только селектор CSS, поддерживаемый браузером. В моем приложении HTML я использую jQuery, но: contains (str) все еще бросает мне недопустимую или незаконную строку, указанную ошибку.

Я набираю текст в компонент Select2, ожидая 10 секунд, а затем пытаюсь выбрать результат.

wd.findElement(By.id("s2id_autogen1")).sendKeys(p.getDisplayName());

// Wait 10 seconds

wd.findElement(By.cssSelector(".select2-result-label:contains('"+p.getDisplayName()+"')")).click();

Почему я все еще получаю эту ошибку; есть идеи? Спасибо!

ОБНОВЛЕНИЕ: Использование xpath не является вариантом. Это нужно сделать с помощью селекторов CSS.

Теги:
selenium
jquery-select2

2 ответа

2
Лучший ответ

Используйте xpath вместо css:

wd.findElement(By.xpath("//[@class='select2-result-label and contains(text(), '"+p.getDisplayName()+"')]")).click();

Если вы пытаетесь избежать xpath, вы можете попробовать этот подход вместо этого:

List<WebElement> elements = wd.findElements(By.cssSelector(".select2-result-label"));
WebElement temp;

foreach(WebElement element in elements)
{
    if(element.getText().contains(p.getDisplayName())
        temp = element;
}

Это psuedo-код, поскольку я не совсем уверен, что вы используете.

  • 0
    Извините, я должен был упомянуть, что я избегаю xpath, потому что сталкиваюсь с кросс-браузерными проблемами с ним. Но да, я читал, что решение xpath, которое вы показываете, должно работать отлично.
  • 0
    Спасибо! Ваш альтернативный подход работает отлично!
2

В вашем обновлении упоминается, что это должно быть сделано в селекторе CSS. Ну, это не может.

Вам не хватает понимания о том, почему contains не поддерживается. contains не является селектором CSS и не является частью спецификации селектора CSS. Причина, по которой вы можете использовать это, - это Sizzle. Sizzle - это библиотека с открытым исходным кодом, которая является механизмом поддержки выбора, который использует jQuery.

Таким образом, ответ просто не может быть выполнен с использованием собственных селекторов CSS. Вам придется либо использовать XPath (ответ Ричарда, который, кстати, является лучшим способом для этого), либо использовать JavaScript для выполнения jQuery на странице. В конце концов, единственная причина, вы можете сделать это из - за Sizzle/JQuery, так что вы все равно придется использовать его как - нибудь.

Pseudo Java ниже:

javascriptDriver = (JavaScriptExecutor)wd;
element = javascriptDriver.executeScript("return $(.select2-result-label:contains('"+p.getDisplayName()+"')");

(предполагая, что jQuery сопоставляется с функцией $, которая, честно говоря, должна быть)

XPath может сделать это изначально, и там, где это необходимо, Selenium вернется к своей собственной реализации XPath (библиотека с открытым исходным кодом под названием Wicked Good XPath). Если вы тестируете современные браузеры, у вас не должно быть большой проблемы (IE является исключением).

  • 0
    Спасибо за объяснение. Я тестирую против IE, поэтому я не использую xpath.
  • 0
    Гах ... ответил на вопрос, почему CSS не работает, и отметил спецификацию, но вы меня опередили! не читал твой первый :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню