webdriver 的官方定位器策略

IT技术 javascript google-chrome selenium chromium chrome-web-driver
2020-12-12 21:19:13

官方的 W3c webdirver 文档中,明确指出定位策略是:

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规范文件中)可能会保留吗?你在哪里读到的?
1个回答

是的,你没看错。

根据目前WebDriver - W3C Candidate RecommendationLocator Strategies入伍情况如下:

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

快照:

定位器策略

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

  • class name: 返回一个元素,其类名包含搜索值;不允许使用复合类名。
  • css selector : 返回匹配 CSS 选择器的元素。
  • id :返回 ID 属性与搜索值匹配的元素。
  • name :返回 NAME 属性与搜索值匹配的元素。
  • link text : 返回一个锚元素,其可见文本与搜索值匹配。
  • partial 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;

快照:

JAVA_classname_id_name_tagname

现在,你的问题一定是为什么这种变化W3C Specs,并在clients根据#1042,来自WebDriver 贡献者的回答非常直接:

This keeps the specification simple as these can be implemented using the CSS selector, which maps down to querySelector/querySelectorAll.

在比较 getElementById 和 querySelector 时,我发现 getElementById 很快。我真的不明白为什么 id locator 已经过时了。请检查:jsperf.com/getelementbyid-vs-queryselector
2021-02-08 21:19:13