tangguo

Webdriver的官方定位器策略

java

在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

在THEORY中,Selenium的文档已过时,新规范文档中包含“真实”故事。然而…

我在最新的Chrome浏览器自己的Webdriver上进行了一些测试,可以确认这一点,name并且class name两者都可以工作。但是,它们不在规格范围内。

我记得在阅读Chromium问题时曾说过,他们只会实施官方的Webdriver规范。

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

  • 您可以在Chromium中找到实现此功能的代码吗?(欢迎链接)
  • Chromium邮件列表中是否有关于这些的讨论?
  • “非官方”命令(在“旧”硒规范文件中有记录)是否有可能保留?你在哪里读的?

阅读 286

收藏
2020-11-12

共1个答案

小编典典

是的,您看对了。

根据目前WebDriver - W3C Candidate Recommendation的Locator Strategies征募情况如下:

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

但是,JsonWireProtocol曾经曾经被用来支持下面列出的“定位器策略”,但是目前该文档明确指出其状态为“已过时”:

  • 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;

现在,您的问题必须是为什么在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.

2020-11-12