cssSelector 的 Selenium WebDriver 问题

Posted

技术标签:

【中文标题】cssSelector 的 Selenium WebDriver 问题【英文标题】:Selenium WebDriver Issue with cssSelector 【发布时间】:2011-12-14 20:15:54 【问题描述】:

我正在尝试使用 Selenium 2.0 WebDriver 中的 CSS 选择器单击按钮。问题是我能够使用 Selenium RC 运行的脚本不适用于 WebDriver。 代码:

硒 RC:

selenium.click("css=.gwt-Button:contains('Run Query')");

效果很好。

Selenium WebDriver:

driver.findElement(By.cssSelector(".gwt-Button:contains('Run Query')")).click(); 

这不起作用。 我正在使用:selenium-server-standalone-2.9.0.jar 和 Firefox 5.0 版。谁能帮我弄清楚为什么 cssSelector 不能与 WebDriver 一起使用?

【问题讨论】:

你能显示你试图选择的元素吗 但我不能使用动态生成的 ID。 @Swagatika:id 是动态生成的。 id的全文是动态生成的吗?还是 id 的最后一部分是动态生成的?这里 id="ext-gen362" 。如果 ext-gen 是固定的并且只有值 (362) 被更改,则可以使用带有 contains 或 starts-with 的 xpath 【参考方案1】:

'Contains' 从 CSS 3 中被弃用。Webdriver 支持浏览器本机支持的任何内容。它适用于 selenium RC,因为 RC 使用 Sizzle 库作为 css 选择器并且它支持“包含”。你有没有尝试过类似的东西,

WebElement element = driver.findElement(By.cssSelector(".gwt-Button[type='button']");
element.click();

如果这不是唯一的,那么您可能需要进一步过滤它。如果您的网站使用 jQuery,那么您可以使用 jQuery 中的“包含”选择器。

javascriptExecutor js = ((JavascriptExecutor)driver);
WebElement element = (WebElement) js.executeScript("return $(\".gwt-Button:contains('Run Query')\")[0];");
element.click();

【讨论】:

感谢您的回复。是的,我可以通过注入 sizzle 库来使其工作。 如果您的应用程序使用 jQuery,那么也许您不需要注入 sizzle 库并污染 DOM。 AFAIK,sizzle 被用作 jQuery 的 CSS 选择器引擎。在这种情况下,我提到的第二种解决方案可能会很好。 是的,问题是我的应用程序不使用 JQuery,这就是为什么我必须单独使用 Sizzle 并使 contains() 方法工作。非常感谢您的帮助。【参考方案2】:

该语法看起来有效,当我在测试页面上删除一些元素然后转到我的控制台并执行 $(".gwt-Button:contains('Run Query')").length 时,我得到了 1更改了按钮的文本。所以我唯一能想到的可能是你有一个运行查询按钮,它存在于页面上但没有显示,所以你得到了运行时异常。在单击它之前,您可能需要检查它是否显示。或者创建一个元素列表,然后删除所有隐藏的(显示 == false)元素。

【讨论】:

以上是关于cssSelector 的 Selenium WebDriver 问题的主要内容,如果未能解决你的问题,请参考以下文章

CssSelector 是我可以用于 shadowroot 的唯一方法吗? selenium.common.exceptions.InvalidArgumentException:消息:无效参数:无效

Selenium WebDriver - 使用 cssSelector 和第 n 个子元素查找元素

html 中没有 id、xpath、classnmae、teg、link、cssselector、name 可用于 selenium 对象识别 java

Selenium----css selector的使用

selenium css定位元素,如何通过By.cssSelector识别元素呢

python+selenium自动化测试——CSS选择元素