Oficjalne strategie lokalizatora dla webdrivera

Jan 22 2018

W oficjalnej dokumentacji webdirvera W3c jest jasno określone, że strategie lokalizacji to:

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"

Jednak protokół przewodowy Selenium pozwolił:

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

W TEORII dokumenty Selenium są przestarzałe, a „prawdziwa” historia znajduje się w nowym dokumencie specyfikacji. Jednak...

Przeprowadziłem kilka testów na najnowszym Webdriverze Chrome i mogę to potwierdzić namei class nameoba działają; jednak nie ma ich w specyfikacji.

Pamiętam, jak czytałem w sprawie Chromium, że kiedykolwiek wdrożyliby tylko oficjalne specyfikacje Webdrivera.

Teraz: znam ogólną odpowiedź, gdzie „specyfikacje nie zawsze są przestrzegane w 100%” itp. Chciałbym jednak wiedzieć:

  • Czy możesz znaleźć kod w Chromium, który to implementuje? (link byłby mile widziany)
  • Czy były jakieś dyskusje na ten temat na liście mailingowej Chromium?
  • Czy „nieoficjalne” polecenia (które są udokumentowane w „starym” pliku specyfikacji selenu) prawdopodobnie pozostaną? Gdzie tak przeczytałeś?

Odpowiedzi

24 DebanjanB Jan 22 2018 at 14:54

Tak, dobrze to widziałeś.

Jak na prąd Powołany przedstawiają się następująco:WebDriver - W3C Candidate RecommendationLocator Strategies

  • "css selector" : Selektor CSS
  • "link text" : Selektor tekstu linku
  • "partial link text" : Częściowy selektor tekstu linku
  • "tag name" : Nazwa znacznika
  • "xpath" : Selektor XPath

Migawka:

Jednak JsonWireProtocolbył kiedyś używany do wsparcia Strategie Locator zaciągnął poniżej, ale obecnie dokumentacja wyraźnie stwierdza, że to status jako OBSOLETE :

  • class name: Zwraca element, którego nazwa klasy zawiera wartość wyszukiwania; nazwy klas złożonych nie są dozwolone.
  • css selector : Zwraca element pasujący do selektora CSS.
  • id : Zwraca element, którego atrybut ID odpowiada wyszukiwanej wartości.
  • name : Zwraca element, którego atrybut NAME jest zgodny z wyszukiwaną wartością.
  • link text : Zwraca element zakotwiczenia, którego widoczny tekst odpowiada wyszukiwanej wartości.
  • partial link text : Zwraca element zakotwiczenia, którego widoczny tekst jest częściowo zgodny z wyszukiwaną wartością.
  • tag name : Zwraca element, którego nazwa znacznika jest zgodna z wartością wyszukiwania.
  • xpath: Zwraca element pasujący do wyrażenia XPath. Podane wyrażenie XPath należy zastosować na serwerze „tak jak jest”; jeśli wyrażenie nie jest względne w stosunku do elementu głównego, serwer nie powinien go modyfikować. W konsekwencji kwerenda XPath może zwrócić elementy, które nie są zawarte w poddrzewie elementu głównego.

Migawka:

Zmiana została propagowana za pośrednictwem odpowiednich powiązań specyficznych dla klienta . Dla Selenium-Javaklientów tutaj jest kod klienta, w którym mamy przełącznik działający dla użytkowników:

        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;

Migawka:

Teraz twoje pytanie musi brzmieć, dlaczego ta zmiana w W3C Specsi w clients. Zgodnie z # 1042, odpowiedź od współtwórców WebDriver była dość prosta:

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