:包含Selenium和Select2的选择器

时间:2014-04-02 15:05:45

标签: jquery selenium jquery-select2

我知道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选择器完成。

2 个答案:

答案 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被映射到$函数,坦白地说,它应该是这样的函数)

XPath可以原生地执行此操作,并且在需要的地方,Selenium将回归到它自己的XPath实现(开源库称为Wicked Good XPath)。如果您正在针对现代浏览器进行测试,那么您应该没有太多问题(IE就是其他问题)。