Я знаю, что 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.
Используйте 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-код, поскольку я не совсем уверен, что вы используете.
В вашем обновлении упоминается, что это должно быть сделано в селекторе 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 является исключением).
:)