English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Сегодня хочу поделиться с вами методом定位父子、братских и相邻 узлов в 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 (при отправке письма, пожалуйста, замените # на @) для сообщения о нарушении,并提供 соответствующие доказательства. Если подтвердится, сайт немедленно удаляет涉嫌侵权的内容。