提问人:Merc 提问时间:1/22/2018 最后编辑:Peter MortensenMerc 更新时间:7/28/2022 访问量:53266
webdriver 的官方定位器策略
Official locator strategies for the webdriver
问:
在官方的 W3C webdriver 文档中,明确指出定位策略是:
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 的有线协议允许:
class name
css selector
id
name
link text
partial link text
tag name
xpath
从理论上讲,Selenium的文档已经过时了,“真实”的故事在新的规范文档中。然而。。。
我在最新的 Chrome 自己的 Webdriver 上运行了一些测试,我可以确认并且两者都有效;但是,它们不在规格中。name
class name
我记得在 Chromium 问题上读到过,他们只会实现官方的 Webdriver 规范。
现在:我知道通用答案,其中“规范并不总是 100% 遵循”,等等。但是,我想知道:
- 你能在 Chromium 中找到实现这一点的代码吗?(非常欢迎链接)
- 在 Chromium 邮件列表中有没有关于这些的讨论?
- “非官方”命令(记录在“旧”Selenium规范文件中)可能会保留吗?证据在哪里?
答:
37赞
undetected Selenium
1/22/2018
#1
是的,你没看错。
根据当前的 WebDriver - W3C 候选建议,列出的定位器策略如下:
- “css selector”: CSS 选择器
- “link text”: 链接文本选择器
- “部分链接文本”:部分链接文本选择器
- “tag name”: 标签名称
- “xpath”: XPath 选择器
快照:
但是,JsonWireProtocol 曾经用于支持下面列出的定位器策略,但目前文档明确指出其状态为过时:
- class name:返回一个元素,其类名包含搜索值;不允许使用复合类名。
- css selector:返回与 CSS 选择器匹配的元素。
- id:返回其 ID 属性与搜索值匹配的元素。
- name:返回其 NAME 属性与搜索值匹配的元素。
- link text:返回一个锚元素,其可见文本与搜索值匹配。
- 部分链接文本:返回一个定位元素,其可见文本部分与搜索值匹配。
- tag name:返回其标签名称与搜索值匹配的元素。
- xpath:返回与 XPath 表达式匹配的元素。提供的 XPath 表达式必须“按原样”应用于服务器;如果表达式不是相对于元素根的,则服务器不应修改它。因此,XPath 查询可能会返回根元素的子树中未包含的元素。
快照:
更改通过相应的特定于客户端的绑定进行传播。对于 Selenium-Java 客户端,这里是客户端代码,我们在其中为用户提供了开关案例:
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 贡献者的答案非常直接:
这使规范保持简单,因为这些可以使用 CSS 选择器来实现,该选择器向下映射到 querySelector/querySelectorAll。
评论
4赞
Purendra Agrawal
7/25/2018
在比较 getElementById 和 querySelector 时,我发现 getElementById 速度很快。我真的不明白为什么 id 定位器已经过时了。请检查: jsperf.com/getelementbyid-vs-queryselector
下一个:为什么模板只能在头文件中实现?
评论