Selenium python get element xpath

How to find Element by XPath in Selenium Python?

To find an HTML Element by an XPath (language used for locating nodes in HTML) using Selenium in Python, call find_element() method and pass By.XPATH as the first argument, and the XPath value as the second argument.

find_element(By.XPATH, "xpath_value")

If there are multiple HTML Elements with the same given XPath value in the webpage, then find_element() returns the first HTML Element of those.

Examples

1. Get first Div in the body

In the following example, we have an HTML page with a div element. In the Python program, we will find the div element using find_element() method and XPath = ‘/html/body/div[1]’.

  

Hello World!

Read More
Go Back

Python Program (Selenium)

from selenium.webdriver.chrome.service import Service from selenium import webdriver from selenium.webdriver.common.by import By service = Service(executable_path="/usr/local/bin/chromedriver") #initialize web driver with webdriver.Chrome(service=service) as driver: #navigate to the url driver.get('http://127.0.0.1:5500/localwebsite/index.html') #find element by xpath myDiv = driver.find_element(By.XPATH, '/html/body/div[1]') print(myDiv) print(myDiv.text)

2. There are multiple elements identified by given XPath

Now, let us consider the scenario where there are multiple HTML Elements that match the given XPath. We will use find_element() function to find the first element which matches with the given XPath ‘//div’.

Even through there are multiple div elements, find_element() returns only the first element of those.

  

First Article

Read More 1
Go Back

Second Article

Read More 2
Go Back

Python Program (Selenium)

from selenium.webdriver.chrome.service import Service from selenium import webdriver from selenium.webdriver.common.by import By service = Service(executable_path="/usr/local/bin/chromedriver") #initialize web driver with webdriver.Chrome(service=service) as driver: #navigate to the url driver.get('http://127.0.0.1:5500/localwebsite/index.html') #find element by xpath myDiv = driver.find_element(By.XPATH, '//div') print(myDiv) print(myDiv.text)

3. There is no element by given XPath

If there is no element by given XPath, find_element() function raises NoSuchElementException.

Читайте также:  Background Color: body gbcolor

In the following example, we have taken an HTML page with no div elements. When we try to find element by the XPath=’//div’ using find_element() function, then the function throws NoSuchElementException.

  

First Article

Second Article

Python Program (Selenium)

from selenium.webdriver.chrome.service import Service from selenium import webdriver from selenium.webdriver.common.by import By service = Service(executable_path="/usr/local/bin/chromedriver") #initialize web driver with webdriver.Chrome(service=service) as driver: #navigate to the url driver.get('http://127.0.0.1:5500/localwebsite/index.html') #find element by xpath myDiv = driver.find_element(By.XPATH, '//div') print(myDiv) print(myDiv.text)
 raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: 

Summary

In this tutorial of Python Examples, we learned how to find an element by given XPath in webpage, using Selenium.

Источник

Selenium для Python. Глава 4. Поиск элементов

Продолжение перевода неофициальной документации Selenium для Python.
Перевод сделан с разрешения автора Baiju Muthukadan.
Оригинал можно найти здесь.

4. Поиск элементов

Существует ряд способов поиска элементов на странице. Вы вправе использовать наиболее уместные для конкретных задач. Selenium предоставляет следующие методы поиска элементов на странице:

  • find_element_by_id
  • find_element_by_name
  • find_element_by_xpath
  • find_element_by_link_text
  • find_element_by_partial_link_text
  • find_element_by_tag_name
  • find_element_by_class_name
  • find_element_by_css_selector
  • find_elements_by_name
  • find_elements_by_xpath
  • find_elements_by_link_text
  • find_elements_by_partial_link_text
  • find_elements_by_tag_name
  • find_elements_by_class_name
  • find_elements_by_css_selector

Помимо общедоступных (public) методов, перечисленных выше, существует два приватных (private) метода, которые при знании указателей объектов страницы могут быть очень полезны: find_element and find_elements.

from selenium.webdriver.common.by import By driver.find_element(By.XPATH, '//button[text()="Some text"]') driver.find_elements(By.XPATH, '//button') 

Для класса By доступны следующие атрибуты:

ID = "id" XPATH = "xpath" LINK_TEXT = "link text" PARTIAL_LINK_TEXT = "partial link text" NAME = "name" TAG_NAME = "tag name" CLASS_NAME = "class name" CSS_SELECTOR = "css selector" 

4.1. Поиск по Id

Используйте этот способ, когда известен id элемента. Если ни один элемент не удовлетворяет заданному значению id, будет вызвано исключение NoSuchElementException.

Для примера, рассмотрим следующий исходный код страницы:

Элемент form может быть определен следующим образом:

login_form = driver.find_element_by_id('loginForm') 

4.2. Поиск по Name

Используйте этот способ, когда известен атрибут name элемента. Результатом будет первый элемент с искомым значением атрибута name. Если ни один элемент не удовлетворяет заданному значению name, будет вызвано исключение NoSuchElementException.

Для примера, рассмотрим следующий исходный код страницы:

Элементы с именами username и password могут быть определены следующим образом:

username = driver.find_element_by_name('username') password = driver.find_element_by_name('password') 

Следующий код получит кнопку “Login”, находящуюся перед кнопкой “Clear”:

continue = driver.find_element_by_name('continue') 

4.3. Поиск по XPath

XPath – это язык, использующийся для поиска узлов дерева XML-документа. Поскольку в основе HTML может лежать структура XML (XHTML), пользователям Selenium предоставляется возможность посредоством этого мощного языка отыскивать элементы в их веб-приложениях. XPath выходит за рамки простых методов поиска по атрибутам id или name (и в то же время поддерживает их), и открывает спектр новых возможностей, таких как поиск третьего чекбокса (checkbox) на странице, к примеру.

Читайте также:  Warning require once system startup php

Одно из веских оснований использовать XPath заключено в наличии ситуаций, когда вы не можете похвастать пригодными в качестве указателей атрибутами, такими как id или name, для элемента, который вы хотите получить. Вы можете использовать XPath для поиска элемента как по абсолютному пути (не рекомендуется), так и по относительному (для элементов с заданными id или name). XPath указатели в том числе могут быть использованы для определения элементов с помощью атрибутов отличных от id и name.

Абсолютный путь XPath содержит в себе все узлы дерева от корня (html) до необходимого элемента, и, как следствие, подвержен ошибкам в результате малейших корректировок исходного кода страницы. Если найти ближайщий элемент с атрибутами id или name (в идеале один из элементов-родителей), можно определить искомый элемент, используя связь «родитель-подчиненный». Эти связи будут куда стабильнее и сделают ваши тесты устойчивыми к изменениям в исходном коде страницы.

Для примера, рассмотрим следующий исходный код страницы:

Элемент form может быть определен следующими способами:

login_form = driver.find_element_by_xpath("/html/body/form[1]") login_form = driver.find_element_by_xpath("//form[1]") login_form = driver.find_element_by_xpath("//form[@id='loginForm']") 
  1. Абсолютный путь (поломается при малейшем изменении структуры HTML страницы)
  2. Первый элемент form в странице HTML
  3. Элемент form, для которого определен атрибут с именем id и значением loginForm
username = driver.find_element_by_xpath("//form[input/@name='username']") username = driver.find_element_by_xpath("//form[@id='loginForm']/input[1]") username = driver.find_element_by_xpath("//input[@name='username']") 
  1. Первый элемент form с дочерним элементом input, для которого определен атрибут с именем name и значением username
  2. Первый дочерний элемент input элемента form, для которого определен атрибут с именем id и значением loginForm
  3. Первый элемент input, для которого определен атрибут с именем name и значением username
clear_button = driver.find_element_by_xpath("//input[@name='continue'][@type='button']") clear_button = driver.find_element_by_xpath("//form[@id='loginForm']/input[4]") 
  1. Элемент input, для которого заданы атрибут с именем name и значением continue и атрибут с именем type и значением button
  2. Четвертый дочерний элемент input элемента form, для которого задан атрибут с именем id и значением loginForm
  • XPath Checker — получает пути XPath и может использоваться для проверки результатов пути XPath
  • Firebug — получение пути XPath — лишь одно из многих мощных средств, поддерживаемых этим очень полезным плагином
  • XPath Helper — для Google Chrome
Читайте также:  Css margin auto display inline block

4.4. Поиск гиперссылок по тексту гиперссылки

Используйте этот способ, когда известен текст внутри анкер-тэга [anchor tag, анкер-тэг, тег «якорь» — тэг — Прим. пер.]. С помощью такого способа вы получите первый элемент с искомым значением текста тэга. Если никакой элемент не удовлетворяет искомому значению, будет вызвано исключение NoSuchElementException.

Для примера, рассмотрим следующий исходный код страницы:

  

Are you sure you want to do this?

Continue Cancel

Элемент-гиперссылка с адресом «continue.html» может быть получен следующим образом:

continue_link = driver.find_element_by_link_text('Continue') continue_link = driver.find_element_by_partial_link_text('Conti') 

4.5. Поиск элементов по тэгу

Используйте этот способ, когда вы хотите найти элемент по его тэгу. Таким способом вы получите первый элемент с указанным именем тега. Если поиск не даст результатов, будет возбуждено исключение NoSuchElementException.

Для примера, рассмотрим следующий исходный код страницы:

  

Welcome

Site content goes here.

Элемент заголовка h1 может быть найден следующим образом:

heading1 = driver.find_element_by_tag_name('h1') 

4.6. Поиск элементов по классу

Используйте этот способ в случаях, когда хотите найти элемент по значению атрибута class. Таким способом вы получите первый элемент с искомым именем класса. Если поиск не даст результата, будет возбуждено исключение NoSuchElementException.

Для примера, рассмотрим следующий исходный код страницы:

Элемент “p” может быть найден следующим образом:

content = driver.find_element_by_class_name('content') 

4.7. Поиск элементов по CSS-селектору

Используйте этот способ, когда хотите получить элемент с использованием синтаксиса CSS-селекторов [CSS-селектор — это формальное описание относительного пути до элемента/элементов HTML. Классически, селекторы используются для задания правил стиля. В случае с WebDriver, существование самих правил не обязательно, веб-драйвер использует синтаксис CSS только для поиска — Прим. пер.]. Этим способом вы получите первый элемент удовлетворяющий CSS-селектору. Если ни один элемент не удовлетворяют селектору CSS, будет возбуждено исключение NoSuchElementException.

Для примера, рассмотрим следующий исходный код страницы:

Элемент “p” может быть определен следующим образом:

content = driver.find_element_by_css_selector('p.content') 
  • 31 CSS селектор — это будет полезно знать! — краткая выжимка по CSS-селекторам
  • CSS селекторы, свойства, значения — отличный учебник параллельного изучения HTML и CSS

Источник

Оцените статью