【问题标题】::contains selector with Selenium and Select2:包含带有 Selenium 和 Select2 的选择器
【发布时间】:2014-04-02 15:05:45
【问题描述】:

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

【问题讨论】:

    标签: jquery selenium jquery-select2


    【解决方案1】:

    使用 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;
    }
    

    这是伪代码,因为我不完全确定你在使用什么。

    【讨论】:

    • 对不起,应该提到我正在避免使用 xpath,因为我面临着跨浏览器的问题。但是,是的,我已经读到您展示的 xpath 解决方案应该可以完美运行。
    【解决方案2】:

    您的更新提到这必须在 CSS 选择器中完成。好吧,它不能。

    您对为什么不支持contains 缺少一些理解。 contains 不是 CSS 选择器,也不是 CSS 选择器规范的一部分。您可以使用它的原因是因为 Sizzle 实现了它。 Sizzle 是一个开源库,是 jQuery 使用的选择器支持引擎。

    所以答案很简单,它不能使用原生 CSS 选择器来完成。您将不得不使用 XPath(Richard 的回答,顺便说一句,这是完成此任务的更好方法)或使用 JavaScript 在页面上执行 jQuery。毕竟,您可以这样做的唯一原因是因为 Sizzle/jQuery,所以您仍然必须以某种方式使用它。

    下面的伪Java:

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

    (假设 jQuery 映射到 $ 函数,坦率地说,应该是这样)

    XPath 可以本机执行此操作,如果需要,Selenium 将回退到它自己的 XPath 实现(名为 Wicked Good XPath 的开源库)。如果您正在针对现代浏览器进行测试,则应该不会有太大问题(IE 除外)。

    【讨论】:

    • 感谢您的解释。我正在针对 IE 进行测试,这是我不使用 xpath 的方式。
    • gah... 回答了为什么 CSS 不起作用的问题,并指出了规范,但你打败了我!没有先读你的:)
    猜你喜欢
    • 2017-08-27
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多