我知道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选择器完成。
答案 0 :(得分: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;
}
这是伪代码,因为我不完全确定你在使用什么。
答案 1 :(得分:2)
您的更新提到必须在CSS选择器中完成。好吧,它不能。
您缺少对为什么 contains
不受支持的理解。 contains
不是CSS选择器,也不是CSS选择器规范的一部分。您可以使用它的原因是因为Sizzle实现了它。 Sizzle是一个开源库,它是jQuery使用的选择器支持引擎。
所以答案很简单就是使用本机CSS选择器无法完成。您将不得不使用XPath(理查德的答案,顺便说一句,这是更好的方法)或使用JavaScript在页面上执行jQuery。毕竟,你可以做这件事的唯一原因是因为Sizzle / jQuery,所以你仍然必须使用它某种程度上。< / p>
下面的伪Java:
javascriptDriver = (JavaScriptExecutor)wd;
element = javascriptDriver.executeScript("return $(.select2-result-label:contains('"+p.getDisplayName()+"')");
(假设jQuery被映射到$
函数,坦白地说,它应该是这样的函数)