Python selenium下利用xpath定位使用教程
先创建一个test.html,演示代码如下:
<html> <body> <div> <div1>节点1</div1> <div1>节点2 <div2>节点2-1 <div3 id="jd2-1-1">节点2-1-1</div3> <div3>节点2-1-2</div3> </div2> <div>节点2-2</div> </div1> <div1 id="jd3">节点3 <div2>节点3-1</div2> </div1> <div1>节点4</div1> </div> </body> </html>
父子节点、兄弟节点、相邻节点概念理解
父子节点:节点2为节点2-1的父节点,反过来节点2-1为节点2的子节点。同理,节点2-1为节点2-1-1的父节点,节点2-1-1为节点2-1的子节点 兄弟节点:节点1、节点2、节点3、节点4为兄弟节点等,节点1为节点2的哥哥节点,节点2为节点1的弟弟节点 相邻节点:节点1的相邻节点为节点2,节点2的相邻节点为节点1和节点3等等
定位元素的N种方式
1.按照节点顺序定位元素
定位到节点2-1-1
from selenium import webdriver driver = webdriver.Chrome() driver.get(D:\test.html) a = driver.find_element_by_xpath(/html/body/div/div1[2]/div2/div3[1])#按照html结构顺序定位元素 b = driver.find_element_by_xpath(//*[@id="jd2-1-1"])#按照标签属性定位元素,表示查找id="jd2-1-1"的标签 c = driver.find_element_by_xpath(//*[contains(text(),"节点2-1-1")])#通过文本内容定位元素,表示查找文本内容包含“节点2-1-1”的标签 print(a.text) print(b.text) print(c.text)
打印出来的结果是相同的
节点2-1-1 节点2-1-1 节点2-1-1
2.通过子节点定位父节点
已知节点2-1-1定位到节点2
from selenium import webdriver driver = webdriver.Chrome() driver.get(D:\test.html) a = driver.find_element_by_xpath(//*[@id="test"]/../..)#"/.."表示当前节点的父节点,由于节点2是节点2-1-1的父节点的父节点,故用"/../.."定位 b = driver.find_element_by_xpath(//*[@id="test"]/parent::*/parent::div1)#"/parent::"表示通过xpath轴获取当前节点的父节点 print(a.text) print(b.text)
打印出来的结果也是相同的
节点2 节点2-1 节点2-1-1 节点2-1-2 节点2-2 节点2 节点2-1 节点2-1-1 节点2-1-2 节点2-2
3.通过相邻节点定位元素
已知节点3,定位到哥哥节点1和弟弟节点4
from selenium import webdriver driver = webdriver.Chrome() driver.get(D:\test.html) a = driver.find_element_by_xpath(//*[@id="jd3"]/preceding-sibling::div1[2])#"/preceding-sibling"表示通过xpath轴往前数两个兄弟节点得到节点1 b = driver.find_element_by_xpath(//*[@id="jd3"]/following-sibling::div1[1])#"/following-sibling"表示通过xpath轴往后数一个兄弟节点得到节点4 print(a.text) print(b.text)
结果如下:
节点1 节点4