webdriver 的官方定位器策略
Official locator strategies for the webdriver
在official W3C webdriver documentation中明确指出定位策略是:
State Keyword
-----------------------------------------------
CSS selector "css selector"
Link text selector "link text"
Partial link text selector "partial link text"
Tag name "tag name"
XPath selector "xpath"
但是,Selenium's wire protocol允许:
class name
css selector
id
name
link text
partial link text
tag name
xpath
在理论中,Selenium 的文档已经过时,“真实”的故事在新的规范文档中。然而...
我运行对最新的Chrome自己的Webdriver进行了一些测试,我可以确认name
和class name
都可以工作;但是,它们不在规格中。
我记得读过一个 Chromium 问题,他们只会实施官方 Webdriver 规范。
现在:我知道 通用答案,其中“规格并不总是 100% 遵循”等。但是,我想知道:
- 你能在 Chromium 中找到实现这个的代码吗? (欢迎 link)
- Chromium 邮件列表中是否讨论过这些内容?
- “非官方”命令(记录在“旧”Selenium 规范文件中)是否可能保留?它的证据在哪里?
是的,你没看错。
根据当前的 WebDriver - W3C 候选推荐,入围的 Locator Strategies 如下:
- css选择器:CSS选择器
- link 文本:Link 文本选择器
- "部分link文本":部分link文本选择器
- “标签名称”:标签名称
- "xpath": XPath 选择器
快照:
然而,JsonWireProtocol 曾被用于支持下面列出的 Locator Strategies,但目前文档明确说明其 Status 作为 已过时:
- class name: Returns 一个元素,其 class name 包含搜索值;不允许使用复合 class 名称。
- css 选择器: Returns 匹配 CSS 选择器的元素。
- id: Returns ID 属性与搜索值匹配的元素。
- name: Returns NAME 属性与搜索值匹配的元素。
- link text: Returns 可见文本与搜索值匹配的定位元素。
- partial link text: Returns 可见文本与搜索值部分匹配的定位元素。
- 标签名称: Returns标签名称与搜索值匹配的元素。
- xpath: Returns 匹配 XPath 表达式的元素。提供的 XPath 表达式必须“按原样”应用于服务器;如果表达式与元素根无关,则服务器不应修改它。因此,XPath 查询可能 return 个元素不包含在根元素的子树中。
快照:
更改通过相应的 客户端 特定绑定传播。对于 Selenium-Java 客户端,这里是 client code 我们有为用户工作的切换案例:
switch (using) {
case "class name":
toReturn.put("using", "css selector");
toReturn.put("value", "." + cssEscape(value));
break;
case "id":
toReturn.put("using", "css selector");
toReturn.put("value", "#" + cssEscape(value));
break;
case "link text":
// Do nothing
break;
case "name":
toReturn.put("using", "css selector");
toReturn.put("value", "*[name='" + value + "']");
break;
case "partial link text":
// Do nothing
break;
case "tag name":
toReturn.put("using", "css selector");
toReturn.put("value", cssEscape(value));
break;
case "xpath":
// Do nothing
break;
}
return toReturn;
快照:
现在,您的问题一定是为什么 W3C 规范 和 客户端 中有此更改。根据 #1042,来自 WebDriver 贡献者 的 answer 非常直截了当:
This keeps the specification simple as these can be implemented using the CSS selector, which maps down to querySelector/querySelectorAll.
在official W3C webdriver documentation中明确指出定位策略是:
State Keyword
-----------------------------------------------
CSS selector "css selector"
Link text selector "link text"
Partial link text selector "partial link text"
Tag name "tag name"
XPath selector "xpath"
但是,Selenium's wire protocol允许:
class name
css selector
id
name
link text
partial link text
tag name
xpath
在理论中,Selenium 的文档已经过时,“真实”的故事在新的规范文档中。然而...
我运行对最新的Chrome自己的Webdriver进行了一些测试,我可以确认name
和class name
都可以工作;但是,它们不在规格中。
我记得读过一个 Chromium 问题,他们只会实施官方 Webdriver 规范。
现在:我知道 通用答案,其中“规格并不总是 100% 遵循”等。但是,我想知道:
- 你能在 Chromium 中找到实现这个的代码吗? (欢迎 link)
- Chromium 邮件列表中是否讨论过这些内容?
- “非官方”命令(记录在“旧”Selenium 规范文件中)是否可能保留?它的证据在哪里?
是的,你没看错。
根据当前的 WebDriver - W3C 候选推荐,入围的 Locator Strategies 如下:
- css选择器:CSS选择器
- link 文本:Link 文本选择器
- "部分link文本":部分link文本选择器
- “标签名称”:标签名称
- "xpath": XPath 选择器
快照:
然而,JsonWireProtocol 曾被用于支持下面列出的 Locator Strategies,但目前文档明确说明其 Status 作为 已过时:
- class name: Returns 一个元素,其 class name 包含搜索值;不允许使用复合 class 名称。
- css 选择器: Returns 匹配 CSS 选择器的元素。
- id: Returns ID 属性与搜索值匹配的元素。
- name: Returns NAME 属性与搜索值匹配的元素。
- link text: Returns 可见文本与搜索值匹配的定位元素。
- partial link text: Returns 可见文本与搜索值部分匹配的定位元素。
- 标签名称: Returns标签名称与搜索值匹配的元素。
- xpath: Returns 匹配 XPath 表达式的元素。提供的 XPath 表达式必须“按原样”应用于服务器;如果表达式与元素根无关,则服务器不应修改它。因此,XPath 查询可能 return 个元素不包含在根元素的子树中。
快照:
更改通过相应的 客户端 特定绑定传播。对于 Selenium-Java 客户端,这里是 client code 我们有为用户工作的切换案例:
switch (using) {
case "class name":
toReturn.put("using", "css selector");
toReturn.put("value", "." + cssEscape(value));
break;
case "id":
toReturn.put("using", "css selector");
toReturn.put("value", "#" + cssEscape(value));
break;
case "link text":
// Do nothing
break;
case "name":
toReturn.put("using", "css selector");
toReturn.put("value", "*[name='" + value + "']");
break;
case "partial link text":
// Do nothing
break;
case "tag name":
toReturn.put("using", "css selector");
toReturn.put("value", cssEscape(value));
break;
case "xpath":
// Do nothing
break;
}
return toReturn;
快照:
现在,您的问题一定是为什么 W3C 规范 和 客户端 中有此更改。根据 #1042,来自 WebDriver 贡献者 的 answer 非常直截了当:
This keeps the specification simple as these can be implemented using the CSS selector, which maps down to querySelector/querySelectorAll.