Вопрос-Ответ

Of the many findElement(s)/By functions in Selenium, when would you use one over the other?

Из множества функций findElement (ов) / By в Selenium, когда бы вы использовали одну вместо другой?

Selenium включает функции findElement, например, так...

.find_element_by_

id
link_text
partial_link_text
name
class_name
tag_name
css_selector
xpath

Очевидно, что некоторые из них ограничены дизайном из-за того, как была создана HTML-страница, например id, link_text, name, tag_name , поскольку не все теги могут содержать id, link_text и т.д... Тем не менее, css_selector и xpath могут выполнять практически все, на что они способны, и даже некоторые другие, но, похоже, ограничены в том, с чем они могут взаимодействовать. Например, некоторые кнопки могут быть недоступны для нажатия с помощью xpath, но могут быть нажаты с помощью css_selector.

Итак, мне интересно, когда бы кто-то захотел использовать одну поверх другой (в частности, xpath или css_selector)?

Другие функции (id, link_text и т.д.) В значительной степени бесполезны, поскольку (по крайней мере) Я обнаружил, что xpath / css_selector также могут это делать?

Есть ли какие-либо преимущества в использовании, скажем, link_text вместо xpath / css_selector?

Переведено автоматически
Ответ 1

По моему опыту, CSS является предпочтительным селектором, потому что он может быть кратким, хорошо документирован, и веб-разработчики, вероятно, будут иметь больше опыта работы с ним.

id, name, tag_name и class_name могут быть легко воспроизведены с помощью простого CSS, поэтому я бы не стал использовать их явно.

например

id ; #my_id

имя; [name="my_name"]

имя_тега; my_tag

имя_класса; .my_class

Использование XPath часто подвергается критике; его называют медленным и нестабильным. Однако я не согласен с этой точкой зрения.

Когда я беру интервью у людей, меня передергивает, когда они говорят, что избегают Xpath, потому что он медленный и хрупкий. Скорость больше не вызывает беспокойства, и xpath такой же хрупкий, как и человек, который его написал. Однако я предпочитаю синтаксис CSS-селекторов, поэтому в большинстве случаев я бы предпочел XPath.

Есть 3 сценария, в которых XPath является лучшим выбором;


  • Несколько селекторов CSS могут быть заменены одним запросом XPath (например, найти элемент, затем выполнить итерацию по вложенным элементам можно в одном xpath)


  • XPath может выбирать на основе текста, где as CSS Selector не может


  • XPath позволяет вам перемещаться по дереву DOM, что может быть действительно полезно, если вы можете идентифицировать элемент управления только по его дочернему элементу


Я бы всегда избегал выбора по тексту, если это возможно, но если бы пришлось, я бы предпочел использовать XPath вместо встроенных методов Link Text и Partial Link Text, потому что запрос Xpath позволил бы мне быть более выразительным и выбирать больше, чем просто теги привязки.

Наконец, единственная ошибка при использовании XPath заключается в том, что "класс" обрабатывается как литеральная строка, а не массив имен классов, как поддерживается в селекторах CSS;

HTML: <div class="ab cd">

CSS matches: div.ab
CSS matches: div.cd
CSS matches: div.cd.ab
CSS matches: div.ab.cd

XPath matches: //div[@class="ab cd"]
XPath matches: //div[contains(@class, "ab")]
XPath matches: //div[contains(@class, "cd")]
XPath matches: //div[contains(@class, "ab") and contains(@class, "cd")]

XPath DOES NOT match: //div[@class="cd"]
XPath DOES NOT match: //div[@class="ab"]
XPath DOES NOT match: //div[@class="cd ab"]
Ответ 2

Этот вопрос задавался и на него были даны ответы на многочисленных форумах в разных форматах. Учитывая их все, если мы расставим приоритеты для локаторов, список будет следующим :


  • id: выберите элемент с указанным id атрибутом.

  • name: Выберите первый элемент с указанным name атрибутом.

  • link_text: выберите элемент link (якорный тег), который содержит текст, соответствующий указанному LinkText.

  • partial_link_text: выберите элемент link (якорный тег), который содержит текст, соответствующий указанному PartialLinkText.

  • имя_тега: найдите элемент с помощью Tag Name.

  • имя_класса: найдите элемент с помощью ClassName.

  • css_selector: выберите элемент с помощью CssSelectors.

  • xpath: найдите элемент с помощью XPath выражения.

Итак , вопрос теперь в том, что нового?

Ответ таков: Selenium в последнее время сильно эволюционировал. WebDriver теперь это W3C Recommendation Candidate. Вещи внутри Selenium меняются довольно быстро. Дело больше не только в выборе локатора. Нам нужно использовать локатор, который будет :


  • Однозначно идентифицируйте элемент.

  • Производительность локатора должна быть оптимизирована.

Принимая во внимание эти два фактора, лучшей стратегией было бы имитировать DOM. В W3C Recommendation Candidate does упоминается список локаторов согласно приведенному ниже :

Selenium_Locators

Итак, вердикт ясен и лаконичен.

python python-3.x selenium selenium-webdriver