English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Подробное объяснение способов定位 родительских, сестринских и相邻ских узлов в Python selenium

Сегодня хочу поделиться с вами методом定位父子、братских и相邻 узлов в selenium. Многие сталкиваются с проблемой, когда не удается напрямую定位 нужный узел, и приходится использовать附近节点进行相对定位. Но定位子节点相对容易,а вот定位父节点或一个节点的哥哥节点就有些棘手了. Не спешите, давайте вместе рассмотрим это шаг за шагом.

1. 由父节点定位子节点

最简单的方法是由父节点定位子节点,我们有多种方法可以进行定位,以下是一个例子:

以下是对以下代码的分析:

<html>
<body>
<div id="A">
<!--父节点定位子节点-->
<div id="B">
<div>parent to child</div>
</div>
</div>
</body>
</html>

想要根据 B节点 定位无id的子节点,以下是一个代码示例:

# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('D:\\py\\AutoTestFramework\\src\\others\\test.html')
# 1.串联寻找
print driver.find_element_by_id('B').find_element_by_tag_name('div').text
# 2.xpath父子关系寻找
print driver.find_element_by_xpath("//div[@id='B']/div").text
# 3.css selector父子关系寻找
print driver.find_element_by_css_selector('div#B>div').text
# 4.css selector nth-child
print driver.find_element_by_css_selector('div#B div:nth-child(1)').text
# 5.css selector nth-of-type
print driver.find_element_by_css_selector('div#B div:nth-of-type(1)').text
# 6.xpath轴 child
print driver.find_element_by_xpath("//div[@id='B']/child::div").text
driver.quit()

Результат:

parent to child
parent to child
parent to child
parent to child
parent to child
parent to child

1-3段都是我们熟悉的方法,所以不再详细说明。第4种方法使用了CSS选择器:nth-child(n),该选择器返回第n个节点,该节点为div标签;第5种方法使用了另一个CSS选择器:nth-of-type(n),该选择器返回第n个div标签,请注意与上一个选择器的区别;第6种方法使用了xpath轴 child,这是xpath默认的轴,可以忽略不写,实际上与方法2相同。

Конечно, в css есть некоторые селекторы, которые могут выбирать父子 отношения, такие как last-child, nth-last-child и т.д., если интересно, можно поискать в百度,有机会 блогер расскажет о css selector.

2. Определение родительского узла от ребенка

Трудно определить родительский узел от ребенка узла, посмотрите на следующий код:

<html>
<body>
<div id="A">
<!--Определение родительского узла от ребенка-->
<div>
<div>child to parent
<div>
<div id="C"></div>
</div>
</div>
</div>
</div>
</body>
</html>

Мы хотим определить div两层父节点 от узла C, пример кода如下:

# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('D:\\py\\AutoTestFramework\\src\\others\\test.html')
# 1.xpath: `.` означает текущий узел; '..' означает родительский узел
print driver.find_element_by_xpath("//div[@id='C']/../..").text
# 2.xpathAxis parent
print driver.find_element_by_xpath("//div[@id='C']/parent::*/parent::div").text
driver.quit()

Результат:

child to parent
child to parent

У нас есть два способа, первый - форма .., как мы знаем, . означает текущий узел, .. означает родительский узел; второй способ такой же, это axis xpath: parent, который выбирает родительский узел текущего узла. Это также痛点 css selector, потому что дизайн css не позволяет получить родительский узел (по крайней мере, в настоящее время нет)

3. Определение старшего брата от младшего узла

Это 3-й и 4-й случаи, мы хотим определить братские узлы. Вот пример кода:

<html>
<body>
<div id="A">
<!--Два следующих узла используются для определения братьев-->
<div>brother 1</div>
<div id="D"></div>
<div>brother 2</div>
</div>
</body>
</html>

Как определить старшего брата узла D? Посмотрите на пример кода:

# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('D:\\Code\\py\\AutoTestFramework\\src\\others\\test.html')
# 1.xpath, через родительский узел получить старшего брата
print driver.find_element_by_xpath("//div[@id='D']/../div[1]").text
# 2.xpathAxis preceding-sibling
print driver.find_element_by_xpath("//div[@id='D']/preceding-sibling::div[1]").text
driver.quit()

结果

brother 1
brother 1

这里博主也列举了两种方法,一种是通过该节点的父节点来获得哥哥节点,另外一种比较优雅,是通过 xpath轴:preceding-sibling,其能够获取当前节点的所有同级哥哥节点,注意括号里的标号,1 代表着离当前节点最近的一个哥哥节点,数字越大表示离当前节点越远,当然,xpath轴:preceding也可以,但是使用起来比较复杂,它获取到的是该节点之前的所有非祖先节点(这里不太好解释,改天专门写篇博文讲解下所有的轴)

4. 由哥哥节点定位弟弟节点

源码与 3 一致,要想通过 D节点 定位其弟弟节点,看代码示例:

# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('D:\\Code\\py\\AutoTestFramework\\src\\others\\test.html')
# 1.xpath,通过父节点获取其弟弟节点
print driver.find_element_by_xpath("//div[@id='D']/../div[3]").text
# 2.xpath轴 following-sibling
print driver.find_element_by_xpath("//div[@id='D']/following-sibling::div[1]").text
# 3.xpath轴 following
print driver.find_element_by_xpath("//div[@id='D']/following::*").text
# 4.css selector +
print driver.find_element_by_css_selector('div#D + div').text
# 5.css selector ~
print driver.find_element_by_css_selector('div#D ~ div').text
driver.quit()

Результат:

брат 2
брат 2
брат 2
брат 2
брат 2

Автор поделился пятью методами поиска弟弟节点, из которых три используются xpath. Первый легко понять. Второй использует xpath axis: following-sibling, который аналогичен preceding-sibling, и его функция - получить все同级弟弟 узлы текущего узла. Также, 1 означает ближайшего弟弟 узла к текущему узлу, и чем больше цифра, тем дальше弟弟 узел от текущего узла. Третий использует xpath axis: following, чтобы получить все узлы после текущего узла, кроме узлов-предков (в отличие от preceding, который направлен в сторону предков, но из-за того, что порядок вниз легко читать и не легко ошибиться, его также можно использовать для поиска弟弟 узлов, но不建议 это делать). Четвертый и пятый методы используют css selector, и разница между + и ~: + означает div узел, сразу следующий за текущим узлом, а ~ означает div узел, следующий за текущим узлом. Если использовать find_elements, можно получить группу div узлов.

Ниже приведено полное описание методов поиска родителей, братьев и соседних узлов в Python selenium, которые были представлены редактором. Надеюсь, это поможет вам. Если у вас есть какие-либо вопросы, пожалуйста, оставляйте комментарии, редактор ответит вам своевременно. В этом отношении редактор также очень благодарен за поддержку сайта呐喊 руководства!

Заявление: данное содержимое взято из Интернета, авторские права принадлежат соответствующему автору. Содержимое предоставлено пользователями Интернета, самостоятельно загруженным, сайт не имеет права собственности, не underwent редактирование и не несет ответственности за соответствующие юридические вопросы. Если вы обнаружите подозрительное содержимое о нарушении авторских прав, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (при отправке письма, пожалуйста, замените # на @) для сообщения о нарушении,并提供 соответствующие доказательства. Если подтвердится, сайт немедленно удаляет涉嫌侵权的内容。

Основной учебник
Вам может понравиться