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父子关系寻找 imprimir 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 imprimir driver.find_element_by_xpath("//div[@id='B']/child::div").text driver.quit()
Resultado:
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: `.`代表当前节点; '..'代表父节点 imprimir driver.find_element_by_xpath("//div[@id='C']/../..").text # 2.xpath轴 parent imprimir driver.find_element_by_xpath("//div[@id='C']/parent::*/parent::div").text driver.quit()
Resultado:
child to parent
child to parent
这里我们有两种办法,第1一种是 .. 的形式,就像我们知道的,. 表示当前节点,.. 表示父节点;第2这种方法与上面相同,是xpath轴中的一个:parent,取当前节点的父节点。这里也是css selector的一个痛点,因为css的设计不允许有能够获取父节点的办法(至少目前没有)
3. ubicado por el nodo hermano
esto es el3、el4en este caso, aquí queremos ubicar los nodos hermanos. Como el siguiente código fuente:
<html> <body> <div id="A"> <!--los dos nodos siguientes se utilizan para la ubicación de nodos hermanos--> <div>hermano 1</div> <div id="D"></div> <div>hermano 2</div> </div> </body> </html>
¿Cómo ubicar al hermano del nodo D? Vea el ejemplo de código:
# -*- coding: utf-8 -*- from selenium import webdriver driver = webdriver.Firefox() driver.get('D:\\Code\\py\\AutoTestFramework\\src\\others\\test.html') # 1.xpath, obtener el hermano del nodo padre imprimir driver.find_element_by_xpath("//div[@id='D']/../div[1").text # 2.árbol xpath anterior-hermano imprimir driver.find_element_by_xpath("//div[@id='D']/preceding-hermano::div[1").text driver.quit()
resultado
hermano 1
hermano 1
en este artículo también se enumeran dos métodos, uno es obtener el nodo hermano a través del nodo padre del nodo actual, y el otro es más elegante, a través del eje xpath: preceding-hermano, que puede obtener todos los nodos hermanos del nodo actual, note el número en los corchetes,1 representa el nodo hermano más cercano al nodo actual, el número mayor indica que está más lejos del nodo actual, por supuesto, también se puede usar el eje: preceding, pero es más complicado de usar, ya que obtiene todos los nodos no ascendientes anteriores a este nodo (es un poco difícil de explicar aquí, escribiré un artículo detallado más tarde sobre todos los ejes)
4. ubicado por el nodo hermano
código fuente y 3 coinciden, para ubicar al hermano del nodo D, vea el ejemplo de código:
# -*- coding: utf-8 -*- from selenium import webdriver driver = webdriver.Firefox() driver.get('D:\\Code\\py\\AutoTestFramework\\src\\others\\test.html') # 1.xpath, obtener el hermano del nodo padre imprimir driver.find_element_by_xpath("//div[@id='D']/../div[3").text # 2.árbol xpath siguiente-hermano imprimir driver.find_element_by_xpath("//div[@id='D']/siguiente-hermano::div[1").text # 3.árbol xpath siguiente imprimir driver.find_element_by_xpath("//div[@id='D']/siguiente::*").text # 4.selector + imprimir driver.find_element_by_css_selector('div#D + div').text # 5.selector ~ print driver.find_element_by_css_selector('div#D ~ div').text driver.quit()
Resultado:
hermano 2
hermano 2
hermano 2
hermano 2
hermano 2
El autor ha compartido cinco métodos para localizar los nodos hermanos, las tres primeras opciones utilizan xpath, la primera es fácil de entender, la segunda utiliza el eje xpath: following-sibling, y preceding-Similar a sibling, su función es obtener todos los nodos hermanos del nodo actual, de manera similar,1 Representa el nodo hermano más cercano al nodo actual, el número mayor indica que está más lejos del nodo actual; la tercera opción utiliza el eje xpath: following, para obtener todos los nodos después de este nodo, excepto los nodos ascendentes (el eje preceding es opuesto, pero debido a que es fácil de leer hacia abajo y no cometer errores, también se puede usar para obtener nodos hermanos, pero no se recomienda su uso); la cuarta y quinta opciones utilizan css selector,+ La diferencia entre ~ es: + Representa el nodo div que sigue inmediatamente al nodo actual, ~ representa el nodo div que sigue al nodo actual, si se usa find_elements, se puede obtener un grupo de nodos div.
La descripción completa de la búsqueda de los nodos padre, hermano y hermano adyacente en Python selenium que el editor le ha presentado a todos ustedes, espero que les haya sido útil. Si tienen alguna pregunta, por favor déjenme un mensaje, el editor responderá a tiempo. También agradezco muy especialmente el apoyo de todos a la página web de tutorial de grito!
Declaración: Este artículo se ha redactado en línea, pertenece al propietario original, el contenido se ha contribuido y subido por los usuarios de Internet de manera autónoma, este sitio web no posee los derechos de propiedad, no se ha realizado un procesamiento editorial humano, ni asume la responsabilidad de las responsabilidades legales relacionadas. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#w.3Declaración: El contenido de este artículo se ha obtenido de la red, pertenece al propietario original, el contenido se ha subido de manera autónoma por los usuarios de Internet, este sitio web no posee los derechos de propiedad, no se ha realizado un procesamiento editorial humano, ni asume la responsabilidad de las responsabilidades legales relacionadas. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#w proporcionando evidencia relevante, una vez que se verifique, este sitio web eliminará inmediatamente el contenido sospechoso de infracción.