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父子关系寻找 imprimer 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 imprimer driver.find_element_by_xpath("//div[@id='B']/child::div).text driver.quit()
Résultat :
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: `.`代表当前节点; '..'代表父节点 imprimer driver.find_element_by_xpath("//div[@id='C']/../..).text # 2.xpath轴 parent imprimer driver.find_element_by_xpath("//div[@id='C']/parent::*/parent::div).text driver.quit()
Résultat :
child to parent
child to parent
这里我们有两种办法,第1是 .. 的形式,就像我们知道的,. 表示当前节点,.. 表示父节点;第2这种方法与上面一样,是xpath轴中的一个:parent,取当前节点的父节点。这里也是css selector的一个痛点,因为css的设计不允许有能够获取父节点的办法(至少目前没有)
3. par le noeud frère pour localiser le frère
C'est le3、le4dans ce cas, nous devons localiser les noeuds frères. Voici le code source suivant :
<html> <body> <div id="A"> <!--Les deux noeuds suivants sont utilisés pour la localisation des frères--> <div>frère 1</div> <div id="D"></div> <div>frère 2</div> </div> </body> </html>
Comment trouver le frère du noeud D ? Voir l'exemple de code :
# -*- coding: utf-8 -*- from selenium import webdriver driver = webdriver.Firefox() driver.get('D:\\Code\\py\\AutoTestFramework\\src\\others\\test.html') # 1.axe XPath, pour obtenir le frère du noeud à partir du parent imprimer driver.find_element_by_xpath("//div[@id='D']/../div[1] # 2.axe XPath preceding-sibling imprimer driver.find_element_by_xpath("//div[@id='D']/preceding-sibling::div[1] driver.quit()
résultat
frère 1
frère 1
ici, le blogueur a également énuméré deux méthodes, l'une est d'obtenir le noeud frère à partir du noeud parent, et l'autre est plus élégante, c'est d'utiliser l'axe XPath : preceding-sibling, qui peut obtenir tous les frères du noeud actuel, attention au numéro dans les crochets,1 représente le frère le plus proche du noeud actuel, un nombre plus grand signifie qu'il est plus éloigné du noeud actuel, bien sûr, l'axe XPath : preceding peut également être utilisé, mais il est plus complexe à utiliser, il obtient tous les noeuds non ancêtres avant le noeud (cela est difficile à expliquer ici, un article spécifique sera écrit un autre jour pour expliquer tous les axes)
4. par le noeud frère
le code source et 3 convenir, pour trouver le frère du noeud D, voir l'exemple de code :
# -*- coding: utf-8 -*- from selenium import webdriver driver = webdriver.Firefox() driver.get('D:\\Code\\py\\AutoTestFramework\\src\\others\\test.html') # 1.axe XPath, pour obtenir le frère du noeud à partir du parent imprimer driver.find_element_by_xpath("//div[@id='D']/../div[3] # 2.axe XPath following-sibling imprimer driver.find_element_by_xpath("//div[@id='D']/following-sibling::div[1] # 3.axe XPath following imprimer driver.find_element_by_xpath("//div[@id='D']/following::*").text # 4.sélecteur CSS + imprimer driver.find_element_by_css_selector('div#D + div').text # 5.sélecteur CSS ~ print driver.find_element_by_css_selector('div#D ~ div').text driver.quit()
Résultat :
frère 2
frère 2
frère 2
frère 2
frère 2
L'auteur a partagé cinq méthodes pour localiser les frères, les trois premières utilisent xpath, la première est facile à comprendre, la deuxième utilise l'axe xpath : following-sibling, et preceding-similaire à sibling, qui permet de récupérer tous les frères jumeaux du noeud actuel, de la même manière que,1 représente le frère le plus proche du noeud actuel, un nombre plus grand signifie que le noeud est plus éloigné du noeud actuel ; la troisième méthode utilise l'axe xpath : following pour obtenir tous les noeuds après le noeud actuel, à l'exception des noeuds ancestors (l'axe preceding est opposé, mais il est facile à lire vers le bas et difficile à faire d'erreur, donc il peut également être utilisé pour obtenir des frères, mais il est déconseillé de l'utiliser) ; la quatrième et cinquième méthodes utilisent les sélecteurs css,+ La différence entre ~ est : + représente le noeud div suivant immédiatement après le noeud actuel, ~ représente le noeud div suivant après le noeud actuel. Si vous utilisez find_elements, vous pouvez obtenir un ensemble de noeuds div.
Voici la totalité de la narration détaillée par l'éditeur sur les méthodes de localisation des parents, des frères et des voisins des éléments fils de Python selenium, j'espère que cela vous sera utile. Si vous avez des questions, n'hésitez pas à laisser un message, l'éditeur vous répondra à temps. Je remercie également tous ceux qui soutiennent le site de tutoriels de cri du cœur !
Déclaration : le contenu de cet article est issu du réseau, et appartient au propriétaire du droit d'auteur. Le contenu est contribué et téléversé par les utilisateurs d'Internet de manière spontanée. Ce site n'appartient pas au propriétaire des droits, n'a pas été traité par l'éditeur humain et n'assume aucune responsabilité juridique connexe. Si vous trouvez du contenu suspect de violation de droits d'auteur, veuillez envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois vérifié, ce site supprimera immédiatement le contenu suspect de violation de droits d'auteur.)