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

Detaillierte Erklärung der定位方式 von Eltern, Geschwistern und Nachbarn in 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()

Ergebnis:

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>

我们想要由 C节点 定位其两层父节点的div,示例代码如下:

# -*- 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.xpath轴 parent
print driver.find_element_by_xpath("//div[@id='C']/parent::*/parent::div).text
driver.quit()

Ergebnis:

child to parent
child to parent

这里我们有两种方法,第1另一种是 .. 的形式,就像我们知道的,. 表示当前节点,.. 表示父节点;第2这种方法与上面相同,是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]
# 2.xpath轴 preceding-sibling
print driver.find_element_by_xpath("//div[@id='D']/preceding-sibling::div[1]
driver.quit()

结果

Bruder 1
Bruder 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]
# 2.xpath轴 following-sibling
print driver.find_element_by_xpath("//div[@id='D']/following-sibling::div[1]
# 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()

Ergebnis:

Bruder 2
Bruder 2
Bruder 2
Bruder 2
Bruder 2

Der Blogger hat fünf Methoden zur Lokalisierung der Bruderknoten vorgestellt, davon die ersten drei mit xpath, der erste ist leicht zu verstehen, der zweite verwendet das xpath-Ax: following-und preceding-ähnlich wie sibling, seine Funktion ist es, alle gleichstufigen Bruderknoten des aktuellen Knotens abzurufen, ähnlich wie sibling,1 Stellt den nächsten Bruderknoten des aktuellen Knotens dar, die Nummer größer ist, desto weiter entfernt der Bruderknoten vom aktuellen Knoten; Der dritte verwendet das XPath-Ax: following, um alle Knoten nach dem aktuellen Knoten zu erhalten, mit Ausnahme der Vorfahrenknoten (der preceding-Richtung ist相反,但因为向下顺序容易读,不容易出错,所以也可以用来获取弟弟节点,但也不建议这样使用);Der vierte und fünfte verwenden css selector,+ Der Unterschied zwischen und ~ ist: + Stellt den div-Knoten dar, der direkt nach dem aktuellen Knoten folgt, ~ stellt den div-Knoten dar, der nach dem aktuellen Knoten folgt, wenn find_elements verwendet wird, können eine Gruppe von div-Knoten abgerufen werden.

Der vorstehende Artikel beschreibt die vollständige Erklärung der Eltern-, Geschwister- und Nachbarschaftspositionen von Python selenium. Ich hoffe, dass es Ihnen hilft. Wenn Sie Fragen haben, hinterlassen Sie bitte eine Nachricht, und ich werde umgehend antworten. Ich danke auch sehr für Ihre Unterstützung für die Website呐喊教程!

Erklärung: Der vorstehende Inhalt wurde aus dem Internet übernommen und gehört dem Urheberrechtsinhaber. Der Inhalt wurde von Internetbenutzern selbstständig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht von Hand bearbeitet. Die Website übernimmt keine Haftung für rechtliche Probleme. Wenn Sie Inhalte finden, die möglicherweise gegen das Urheberrecht verstoßen, freuen wir uns über Ihre E-Mail an: notice#w3Anzeige: Der Inhalt dieses Artikels wurde aus dem Internet entnommen und gehört dem Urheberrechtsinhaber. Der Inhalt wurde von Internetbenutzern selbstständig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht von Hand bearbeitet. Die Website übernimmt keine Haftung für rechtliche Probleme. Wenn Sie Inhalte finden, die möglicherweise gegen das Urheberrecht verstoßen, senden Sie bitte eine E-Mail an: notice#w

Empfohlene Artikel