Официальные стратегии поиска для вебдрайвера

В официальной документации W3c о веб-драйверах четко указано, что стратегии определения местоположения:

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

В ТЕОРИИ документы Selenium устарели, а "настоящая" история - в новой спецификации. Тем не мение...

Я провел несколько тестов на новейшем веб-драйвере Chrome и могу подтвердить, что name а также class name обе работы; Однако они не в спецификации.

Я помню, как читал о проблеме Chromium, что они будут реализовывать только официальные спецификации Webdriver.

Теперь: я знаю общий ответ, где "спецификации не всегда соблюдаются на 100%" и т. Д. Однако я хотел бы знать следующее:

  • Можете ли вы найти код в Chromium, который реализует это? (ссылка будет приветствоваться)
  • Были ли обсуждения по этому поводу в списке рассылки Chromium?
  • Вероятно ли останутся "неофициальные" команды (которые описаны в "старом" файле селеновых спецификаций)? Где ты так прочитал?

2 ответа

Решение

Да, вы видели это правильно.

По текущему WebDriver - W3C Candidate Recommendation Locator 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 клиенты вот код клиента, где у нас есть коммутатор, работающий для пользователей:

        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, Согласно #1042, ответ от участников WebDriver был довольно прямым:

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

Другие вопросы по тегам