【发布时间】:2012-06-21 12:54:21
【问题描述】:
动机
利用 Selenium 的 CSS 选择器机制以及 CSS 属性选择器和 HTML5 data- 自定义属性来处理元素的特定钩子。
问题
使用上述方法定位分配有 CSS 类名和 data- 属性的元素时,会引发以下异常:
Caused by: org.openqa.selenium.remote.ErrorHandler$UnknownServerException: The given selector .gs-a-btn["data-value"] is either invalid or does not result in a WebElement. The following error occurred:
[Exception... "An invalid or illegal string was specified" code: "12" nsresult: "0x8053000c (NS_ERROR_DOM_SYNTAX_ERR)" location: "file:///C:/DOCUME~1/eliranm/LOCALS~1/Temp/anonymous6109849275533680625webdriver-profile/extensions/fxdriver@googlecode.com/components/driver_component.js Line: 5956"]
Build info: version: '2.23.1', revision: '17143', time: '2012-06-08 18:59:28'
System info: os.name: 'Windows XP', os.arch: 'x86', os.version: '5.1', java.version: '1.6.0_31'
Driver info: driver.version: unknown
at <anonymous class>.<anonymous method>(file:///C:/DOCUME~1/eliranm/LOCALS~1/Temp/anonymous6109849275533680625webdriver-profile/extensions/fxdriver@googlecode.com/components/driver_component.js:6537)
相关代码
public void previous(String type) {
By cssSelector = By.cssSelector(".gs-a-btn[data-value='" + type + "']");
driver.findElement(cssSelector).click();
}
我尝试了什么
- 在属性选择器查询中用转义的双引号替换单引号。
- 指定属性选择器而不是属性值选择器,即
".gs-a-btn[\"data-value\"]"而不是".gs-a-btn[data-value='" + type + "']"。 -
在引用中查找信息,例如Selenium Reference,以了解对 CSS 属性选择器的任何限制。该文件特别指出:
目前 css 选择器定位器支持所有 css1、css2 和 css3 除了 css3 中的命名空间之外的选择器,一些伪类(
:nth-of-type,:nth-last-of-type,:first-of-type,:last-of-type,:only-of-type,:visited、:hover、:active、:focus、:indeterminate) 和伪 元素(::first-line,::first-letter,::selection,::before,::after)。
【问题讨论】:
-
您是否尝试过替换或转义
type值中的引号? -
是的,无济于事。现在继续调查,这似乎是一个时间问题,因为选择带有属性选择器的
By.cssSelector似乎比仅使用By.className慢。它偶尔会失败。 -
@EliranMalka
By.className内部使用(至少在 Firefox 上)document.getElementsByClassName()(已缓存),因此应该几乎是即时的。By.cssSelector使用document.querySelector()和document.querySelectorAll()需要一段时间来解析和处理。如果是时间问题,我希望偶尔出现NoSuchElementException(可以修复),而不是奇怪的UnknownServerException。
标签: selenium css-selectors webdriver