以下为使用Python Selenium实现XPath定位的代码示例:
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# ================== 基本定位 ==================
# 1. 标签名定位
driver.find_element("xpath", "//input")
# 2. 标签+单个属性定位
driver.find_element("xpath", "//input[@id='kw']")
# 3. 标签+多个属性组合
driver.find_element("xpath", "//input[@id='kw' and @name='wd']")
# 4. 文本定位
driver.find_element("xpath", "//a[text()='新闻']").click()
# 5. 模糊匹配定位
driver.find_element("xpath", "//a[contains(text(),'新')]")
# ================== 层级定位 ==================
# 层级关系定位
driver.find_element("xpath", "//span[@id='s_kw_wrap']//input")
# ================== 轴定位 ==================
# 1. parent父节点定位
driver.find_element("xpath", "//span[text()='设置']/parent::a")
# 2. ancestor祖先节点
driver.find_element("xpath", "//span[text()='高级搜索']/ancestor::div[@id='wrapper']")
# 3. following后续节点
driver.find_element("xpath", "//div[@id='s-top-left']/following::div[@id='s-top-right']")
# 4. preceding前方节点
driver.find_element("xpath", "//div[@id='s-top-right']/preceding::div[@id='s-top-left']")
# 5. following-sibling后续兄弟节点
driver.find_element("xpath", "//div[@id='s-top-left']/following-sibling::div[1]")
# 6. preceding-sibling前方兄弟节点
driver.find_element("xpath", "//div[@id='s-top-right']/preceding-sibling::div[1]")
# ================== 动态元素处理 ==================
# 处理动态ID
driver.find_element("xpath", "//div[starts-with(@id, 'test_')]")
driver.find_element("xpath", "//div[contains(@id, 'kw')]")
# 处理动态文本
driver.find_element("xpath", "//a[contains(text(), '部分文本')]")
sleep(3)
driver.quit()
关键技巧说明:
- 优先使用元素唯一属性:
//input[@id='kw'] # 最推荐方式
//input[@name='wd']
- 组合定位策略时:
//input[@id='kw' and @maxlength='255'] # 多个属性组合
//div[@class='menu']//a[contains(text(),'产品')] # 层级+文本组合
- 处理动态元素:
//div[starts-with(@id, 'auto_')] # ID前缀固定
//span[contains(@class, 'icon')] # 类名包含特定字符
- 表格定位示例:
# 定位"42期"课程的成绩管理
//td[text()='42期']/following-sibling::td[1]//span[text()='成绩管理']
- 处理隐藏元素:
//div[not(contains(@style, 'display: none'))] # 排除隐藏元素
//input[@type='hidden']/following::input[1] # 定位隐藏元素后的可见元素
定位优先级建议:
- 优先使用id/name等唯一属性
- 次选text文本定位(需注意国际化问题)
- 复杂结构使用轴定位
- 慎用绝对路径(易受页面结构调整影响)
- 动态内容优先使用contains等函数
当元素定位困难时,可以:
- 使用浏览器开发者工具的XPath验证功能(Ctrl+F)
- 添加显式等待(WebDriverWait)
- 结合CSS Selector进行定位
- 通过JavaScript直接操作元素