【问题标题】:Official locator strategies for the webdriverwebdriver的官方定位器策略
【发布时间】:2018-06-30 08:15:27
【问题描述】:

official W3c webdirver 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

在 THEORY 中,Selenium 的文档已经过时,“真实”的故事在新的规范文档中。不过……

我对最新的 Chrome 自己的 Webdriver 进行了一些测试,我可以确认 nameclass name 都可以工作;但是,它们不在规格中。

我记得读过一个 Chromium 问题,他们只会实现官方 Webdriver 规范。

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

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

【问题讨论】:

标签: javascript google-chrome selenium chromium chrome-web-driver


【解决方案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 客户,这里是 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 Specsclients 会发生这种变化。根据#1042WebDriver Contributors 的回答非常直截了当:

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

【讨论】:

猜你喜欢
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多