webdriver

时间:2018-01-21 16:31:25

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

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

在理论中,Selenium的文档已经过时,“真实”的故事在新的规范文档中。但是......

我对最新的Chrome自己的Webdriver进行了一些测试,我可以确认nameclass name都有效;但是,它们不符合规范。

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

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

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

1 个答案:

答案 0 :(得分:8)

是的,你看对了。

根据当前 WebDriver - W3C Candidate Recommendation Locator Strategies入伍的人数如下:

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

快照:

Locator Strategies

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

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

快照:

Locator Strategies

此更改通过各自的客户端特定绑定传播。对于 Selenium-Java 客户,这里是client code,我们为用户提供了switchcase:



        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 中此更改的原因。根据{{​​3}},来自 WebDriver贡献者的答案非常简单:

  

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