Из множества функций 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 упоминается список локаторов согласно приведенному ниже :
Итак, вердикт ясен и лаконичен.