javascriptgoogle-chromeseleniumchromiumchrome-web-driver

Official locator strategies for the webdriver


In the official W3C webdriver documentation, it's clearly stated that the location strategies are:

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"

However, Selenium's wire protocol allowed:

class name
css selector
id
name
link text
partial link text
tag name
xpath

In theory, Selenium's documentation is obsolete and the "real" story is in the new specification document. However...

I ran some tests on the latest Chrome's own Webdriver, and I can confirm that name and class name both work; however, they are not in the specifications.

I remember reading on a Chromium issue that they would only ever implement the official Webdriver specifications.

Now: I know the generic answer, where "specifications are not always followed 100%", etc. However, I'd like to know:


Solution

  • Yes, you saw it right.

    As per the current WebDriver - W3C Candidate Recommendation the Locator Strategies enlisted are as follows:

    Snapshot:

    Locator Strategies

    However, the JsonWireProtocol was once used to support the Locator Strategies enlisted below, but currently the documentation clearly states its Status as obsolete:

    Snapshot:

    Locator Strategies

    The change was propagated through the respective client-specific bindings. For the Selenium-Java clients here is the client code where we have the switch case working for the users:

            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;

    Snapshot:

    JAVA_classname_id_name_tagname

    Now, your question must be why this change in the W3C specification and in the clients. As per #1042 the answer from the WebDriver Contributors was pretty straight as:

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