Как вы, возможно, уже поняли, чтобы управлять элементами страницы, нам нужно сначала найти их. Selenium использует так называемые локаторы, чтобы находить элементы на веб-странице.
В Selenium есть 8 методов которые помогут в поиске HTML элементов:
Цель поиска Используемый метод |
Пример | ||
Поиск по ID find_element_by_id("user") |
|
||
Поиск по имени find_element_by_name("username") |
|
||
Поиск по тексту ссылки find_element_by_link_text("Login") |
|
||
Поиск по частичному тексту ссылки find_element_by_partial_link_text("Next") |
|
||
Поиск используя XPath find_element_by_xpath(‘//div[@id="login"]/input’) |
|
||
Поиск по названию тэга find_element_by_tag_name("body") |
|
||
Поиск по классу элемента find_element_by_class_name("table") |
|
||
Поиск по CSS селектору find_element_by_css_selector(‘#login > input[type="text"]’) |
|
Вы можете использовать любой из них, чтобы сузить поиск элемента, который вам нужен.
Запуск браузера
Тестирование веб-сайтов начинается с браузера. В приведенном ниже тестовом скрипте запускается окно браузера Firefox, и осуществляется переход на сайт.
1 2 3 |
from selenium import webdriver driver = webdriver.Firefox() driver.get("http://testwisely.com/demo") |
Используйте webdriver.Chrome и webdriver.Ie() для тестирования в Chrome и IE соответственно. Новичкам рекомендуется закрыть окно браузера в конце тестового примера.
1 |
driver.quit() |
Поиск элемента по ID
Использование идентификаторов — самый простой и безопасный способ поиска элемента в HTML. Если страница соответствует W3C HTML, идентификаторы должны быть уникальными и идентифицироваться в веб-элементах управления. По сравнению с текстами тестовые сценарии, использующие идентификаторы, менее склонны к изменениям приложений (например, разработчики могут принять решение об изменении метки, но с меньшей вероятностью изменить идентификатор).
1 2 3 4 |
driver.find_element_by_id("submit_btn").click() # Клик по кнопке driver.find_element_by_id("cancel_link").click() # Клик по ссылке driver.find_element_by_id("username").send_keys("agileway") # Ввод символов driver.find_element_by_id("alert_div").text # Получаем текст |
Поиск элемента по имени
Атрибут имени используются в элементах управления формой, такой как текстовые поля и переключатели (radio кнопки). Значения имени передаются на сервер при отправке формы. С точки зрения вероятности будущих изменений, атрибут name, второй по отношению к ID.
1 |
driver.find_element_by_name("comment").send_keys("Selenium Cool") |
Поиск элемента по тексту ссылки
Только для гиперссылок. Использование текста ссылки — это, пожалуй, самый прямой способ щелкнуть ссылку, так как это то, что мы видим на странице.
1 |
driver.find_element_by_link_text("Cancel").click() |
HTML для которого будет работать
1 |
<a href="/cancel">Cancel</a> |
Поиск элемента по частичному тексту ссылки
Selenium позволяет идентифицировать элемент управления гиперссылкой с частичным текстом. Это может быть полезно, если текст генерируется динамически. Другими словами, текст на одной веб-странице может отличаться при следующем посещении. Мы могли бы использовать общий текст, общий для этих динамически создаваемых текстов ссылок, для их идентификации.
1 2 |
# Полный текст ссылки "Cancel Me" driver.find_element_by_partial_link_text("ance").click() |
HTML для которого будет работать
1 |
<a href="/cancel">Cancel me</a> |
Поиск элемента по XPath
XPath, XML Path Language, является языком запросов для выбора узлов из XML документа. Когда браузер отображает веб-страницу, он анализирует его в дереве DOM. XPath может использоваться для ссылки на определенный узел в дереве DOM. Если это звучит слишком сложно для вас, не волнуйтесь, просто помните, что XPath — это самый мощный способ найти определенный веб-элемент.
1 2 |
# Клик по флажку в контейнере с ID div2 driver.find_element_by_xpath("//*[@id='div2']/input[@type='checkbox']").click() |
HTML для которого будет работать
1 2 3 4 5 |
<form> <div id="div2"> <input value="rules" type="checkbox"> </div> </form> |
Некоторые тестеры чувствуют себя "запуганными" сложностью XPath. Тем не менее, на практике существует только ограниченная область для использования XPath.
Избегайте XPath из Developer Tool
Избегайте использования скопированного XPath из инструмента Developer Tool.
Инструмент разработчика браузера (щелкните правой кнопкой мыши, чтобы выбрать «Проверить элемент», чтобы увидеть) очень полезен для определения веб-элемента на веб-странице. Вы можете получить XPath веб-элемента там, как показано ниже (в Chrome):
Скопированный XPath для второй ссылки «Нажмите здесь» в примере:
1 |
//*[@id="container"]/div[3]/div[2]/a |
Этот метод работает. Тем не менее, этот подход не рекомендуется для постоянного применения, поскольку тестовый сценарий является довольно хрупким и изменчивым.
Попытайтесь использовать выражения XPath, которое менее уязвимо для структурных изменений вокруг веб-элемента.
Поиск элемента по имени тега
В HTML есть ограниченный набор имен тегов. Другими словами, многие элементы используют одни и те же имена тегов на веб-странице. Обычно мы не используем локатор tag_name для поиска элемента. Мы часто используем его с другими элементами в цепочке локаторах. Однако есть исключение.
1 |
driver.find_element_by_tag_name("body").text |
Вышеприведенная тестовая инструкция возвращает текстовое содержимое веб-страницы из тега body.
Поиск элемента по имени класса
Атрибут class элемента HTML используется для стилизации. Он также может использоваться для идентификации элементов. Как правило, атрибут класса элемента HTML имеет несколько значений, как показано ниже.
1 2 3 4 5 |
<a href="back.html" class="btn btn-default">Cancel</a> <input type="submit" class="btn btn-deault btn-primary"> Submit </input> |
Вы можете использовать любой из них.
1 2 3 4 5 |
driver.find_element_by_class_name("btn-primary").click() # Клик по кнопки driver.find_element_by_class_name("btn").click() # Клик по ссылке # # |
Метод class_name удобен для тестирования библиотек JavaScript / CSS (таких как TinyMCE), которые обычно используют набор определенных имен классов.
1 2 3 4 5 6 7 |
driver.find_element_by_id("client_notes").click() time.sleep(0.5) driver.find_element_by_class_name("editable-textarea").send_keys("inline notes") time.sleep(0.5) driver.find_element_by_class_name("editable-submit").click() |
Поиск элемента с помощью селектора CSS
Вы также можете использовать CSS селектор для поиска веб-элемента.
1 |
driver.find_element_by_css_selector("#div2 > input[type='checkbox']").click() |
Однако использование селектора CSS, как правило, более подвержено структурным изменениям веб-страницы.
Используем find_elements для поиска дочерних элементов
Для страницы, содержащей более одного элемента с такими же атрибутами, как приведенный ниже, мы могли бы использовать XPath селектор.
1 2 3 4 5 6 7 |
<div id="div1"> <input type="checkbox" name="same" value="on"> Same checkbox in Div 1 </div> <div id="div2"> <input type="checkbox" name="same" value="on"> Same checkbox in Div 2 </div> |
Есть еще один способ: цепочка из find_element чтобы найти дочерний элемент.
1 |
driver.find_element_by_id("div2").find_element_by_name("same").click() |
Поиск нескольких элементов
Как следует из названия, find_elements возвращает список найденных элементов. Его синтаксис точно такой же, как find_element, то есть он может использовать любой из 8 локаторов.
Пример HTML кода
1 2 3 4 |
<div id="container"> <input type="checkbox" name="agree" value="yes"> Yes <input type="checkbox" name="agree" value="no"> No </div> |
Выполним клик по второму флажку.
1 2 3 4 |
checkbox_elems = driver.find_elements_by_xpath("//div[@id='container']//input[@type='checkbox']") print(len(checkbox_elems)) # Результат: 2 checkbox_elems[1].click() |
Иногда find_element вылетает из-за нескольких совпадающих элементов на странице, о которых вы не знали. Метод find_elements пригодится, чтобы найти их.