webdriver 的官方定位器策略

Official locator strategies for the webdriver

提问人:Merc 提问时间:1/22/2018 最后编辑:Peter MortensenMerc 更新时间:7/28/2022 访问量:53266

问:

官方的 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 上运行了一些测试,我可以确认并且两者都有效;但是,它们不在规格中。nameclass name

我记得在 Chromium 问题上读到过,他们只会实现官方的 Webdriver 规范。

现在:我知道通用答案,其中“规范并不总是 100% 遵循”,等等。但是,我想知道:

  • 你能在 Chromium 中找到实现这一点的代码吗?(非常欢迎链接)
  • 在 Chromium 邮件列表中有没有关于这些的讨论?
  • “非官方”命令(记录在“旧”Selenium规范文件中)可能会保留吗?证据在哪里?
javascript google-chrome selenium chromium chrome-web-driver

评论

0赞 Grasshopper 1/22/2018
Chrome 驱动程序代码位于页面上这些链接中的某个位置 - sites.google.com/a/chromium.org/chromedriver/contributing。一些有助于解释这种差异的更多信息 - github.com/mozilla/geckodriver/issues/1041

答:

37赞 undetected Selenium 1/22/2018 #1

是的,你没看错。

根据当前的 WebDriver - W3C 候选建议,列出的定位器策略如下:

  • “css selector”: CSS 选择器
  • “link text”: 链接文本选择器
  • “部分链接文本”:部分链接文本选择器
  • “tag name”: 标签名称
  • “xpath”: XPath 选择器

快照:

Locator Strategies

但是,JsonWireProtocol 曾经用于支持下面列出的定位器策略,但目前文档明确指出其状态过时

  • class name:返回一个元素,其类名包含搜索值;不允许使用复合类名。
  • css selector:返回与 CSS 选择器匹配的元素。
  • id:返回其 ID 属性与搜索值匹配的元素。
  • name:返回其 NAME 属性与搜索值匹配的元素。
  • link text:返回一个锚元素,其可见文本与搜索值匹配。
  • 部分链接文本:返回一个定位元素,其可见文本部分与搜索值匹配。
  • tag name:返回其标签名称与搜索值匹配的元素。
  • xpath:返回与 XPath 表达式匹配的元素。提供的 XPath 表达式必须“按原样”应用于服务器;如果表达式不是相对于元素根的,则服务器不应修改它。因此,XPath 查询可能会返回根元素的子树中未包含的元素。

快照:

Locator Strategies

更改通过相应的特定于客户端的绑定进行传播。对于 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;

快照:

JAVA_classname_id_name_tagname

现在,您的问题一定是为什么 W3C 规范客户端会发生这种变化。根据 #1042,WebDriver 贡献者的答案非常直接:

这使规范保持简单,因为这些可以使用 CSS 选择器来实现,该选择器向下映射到 querySelector/querySelectorAll。

评论

4赞 Purendra Agrawal 7/25/2018
在比较 getElementById 和 querySelector 时,我发现 getElementById 速度很快。我真的不明白为什么 id 定位器已经过时了。请检查: jsperf.com/getelementbyid-vs-queryselector