Selenium08--XPath定位
原创
©著作权归作者所有:来自51CTO博客作者分享智道的原创作品,请联系作者获取转载授权,否则将追究法律责任
XPath
- XPath全称是XML PATH(XML路径语言),是在XML文档里使用路径表达式来描述目标节点的一种技术,属于一个前端开发技术
XML
- 叫做可扩展标记语言
- 它是对HTML的扩展,所有的标记以及标记的属性都可以自己定义
- XML的设计宗旨是传输数据,而不是显示数据,所以XML标间没有被预定义,需要自行定义标签XPath
- 书店数据用XML格式表示:
XPath和XPath表达式
XPath是一种在XML文档里查找信息的一种语言,可以用来在XML文档中对元素及其属性进行搜索查找
XPath表达式是描述XML节点所在路径的表达式,用来选取XML文档中的节点或节点集
XPath表达式
树形结构是交互设计中的基础组件,可用清晰的层级结构来展示层级信息,便于用户根据数据之间的关系来逐级找到相应的节点及数据
XPath表达式示例:/书店/图书[1]/书名
XPath在HTML中使用
由于HTML文档本身遵循XML页面的语法规则,所以可以使用XPath来定位页面元素
HTML文档树形结构:
XPath表达式可以用来描述HTML网页里的网页元素所在的路径
示例:/html/body/div/a
为什么要使用XPath定位
selenium测试目标就是HTML格式的网页,HTML语法与XML接近,所以XPath技术也可以适用于在HTML网页里查找元素
描述元素所在的路径可以使用XPath表达式
WebDriver里提供XPATH定位,来使用XPath表达式进行页面元素的定位
# 语法
变量 = driver.find_element(By.XPATH,'XPath表达式')
获得XPath表达式
- Firefox浏览器自带工具:
- Web开发者 → 查看器 → 目标元素代码 → 复制 → XPath
"""
启动Firefox,打开前台留言板页,点击网页左上角ECSHOP的商标,等待3秒,关闭浏览器
"""
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
driver = webdriver.Firefox() # 启动浏览器
driver.get('http://localhost/upload/message.php') # 前台留言板
LOGO = driver.find_element(By.XPATH,'/html/body/div[1]/div[1]/a/img')
LOGO.click()
sleep(3) # 等待3秒
driver.quit() # 关闭浏览器
"""
启动Firefox,打开前台留言板页,点击网页左上角ECSHOP的商标,点击登录,等待3秒,点击注册,等待3秒,点击当前位置后面首页,等待3秒,关闭浏览器
"""
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
driver = webdriver.Firefox() # 启动浏览器
driver.get('http://localhost/upload/message.php') # 前台留言板
LOGO = driver.find_element(By.XPATH,'/html/body/div[1]/div[1]/a/img')
LOGO.click()
sleep(3) # 等待3秒
# login = driver.find_element(By.XPATH,'/html/body/div[1]/div[2]/ul/li[1]/font/a[1]/img')
login = driver.find_element(By.XPATH,'//*[@id="ECS_MEMBERZONE"]/a[1]/img')
login.click()
sleep(3) # 等待3秒
sign = driver.find_element(By.XPATH,'/html/body/div[1]/div[2]/ul/li[1]/font/a[2]/img')
sign.click()
sleep(3) # 等待3秒
driver.find_element(By.XPATH,'/html/body/div[5]/div/a').click()
sleep(3) # 等待3秒
driver.quit() # 关闭浏览器
XPATH定位注意事项
- XPATH表达式支持单引号,也支持双引号
- python语法中字符串引号与XPath表达式里的引号不要使用同一种
- 针对同一个页面元素,使用不同的工具获得的XPath表达式可能不同。
- Firefox获得的XPath表达式:
/html/body/div[1]/div[2]/ul/li[1]/font/a[1]/img - Chrome获得的XPath表达式:
//*[@id="ECS_MEMBERZONE"]/a[1]/img
XPath表达式与页面元素的关系
- 一个XPath表达式可以对应多个页面元素
- 一个页面元素也可以有多种XPath表达式写法
XPATH表达式分为两种
- 绝对路径:从最顶层节点(根节点)开始描述,向下层一层一层进行路径的描述,对于HTML网页来说,html就是根节点,以/html或html开头
相对路径:不从最顶层节点开始描述,从中间某层开始描述或直接描述目标,以//开头,建议使用,可维护性好谓词
也叫做筛选表达式或过滤表达式,用于附加筛选的条件,从节点中筛选出满足条件的节点
谓词的作用:使定位更加精准
谓词的语法:[筛选条件]
- 谓词的中括号可以写在各个层级的标记名称之后
- 筛选条件用于对节点进一步说明和限定
"""
打开首页,输入关键字806,点击搜索,点击登录,点击注册,在每一项操作时等待3秒,关闭浏览器
"""
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
driver = webdriver.Firefox() # 启动浏览器
driver.get('http://localhost/upload/index.php')
driver.find_element(By.XPATH,'//*[@id="keyword"]').send_keys('806')
driver.find_element(By.XPATH,'/html/body/div[4]/form/input[2]').click()
LOGO = driver.find_element(By.XPATH,'/html/body/div[1]/div[1]/a/img')
LOGO.click()
sleep(3) # 等待3秒
# login = driver.find_element(By.XPATH,'/html/body/div[1]/div[2]/ul/li[1]/font/a[1]/img')
login = driver.find_element(By.XPATH,'//*[@id="ECS_MEMBERZONE"]/a[1]/img')
login.click()
sleep(3) # 等待3秒
sign = driver.find_element(By.XPATH,'/html/body/div[1]/div[2]/ul/li[1]/font/a[2]/img')
sign.click()
sleep(3) # 等待3秒
driver.find_element(By.XPATH,'/html/body/div[5]/div/a').click()
sleep(3) # 等待3秒
driver.quit() # 关闭浏览器
XPATH函数库
XPath提供了函数库为我们提供功能丰富的各种函数的调用
函数分类:
- 节点函数
- 字符串函数
- 布尔函数
- 数值函数
XPath里的常用函数
- last函数
- 返回同父同标记的兄弟节点节点总个数(也就是最后一个节点索引号),可以用于选择倒数第几个节点。
- 例1://li[@id='topNav']/a[last()] 选择最后一个a节点
- 例2://li[@id='topNav']/a[last()-1] 选择倒数第二个a节点
- position函数
- 返回指定值所表示的节点的位置(当前节点的索引号),选择当前的第几个节点。
- 例1://li[@id='topNav']/a[position()<2]
- text函数
- 获得一个节点的文本值,无参。
- 说明:适用于任何有文本的双标记节点。
- 示例:
- 例1://a[text()='选购中心'] 可以匹配文本是'选购中心'的超级链接
- contains函数
- 用来判断str1是否包含str2,其中str1一般是@属性名或text()。
- 示例:
- 例1://a[contains(text(),'高级')] 表示选择文本值里包含'高级'的a节点。
- 例2: //input[contains(@id,'key')] 表示选择id中包含有'key'的input节点。
- starts-with函数
- 用来判断str1是否以str2开头,返回布尔值,其中str1一般是@属性名或text()。
- 示例:
- 例1://input[starts-with(@id,'sc')] ,选择以'sc'开头的id属性的input节点
not函数
not()函数表示否定,取反,一个参数。常与返回值为布尔值的函数组合起来用,比如contains(),starts-with()等。
示例:
例1://select[not(contains(@name,'o'))]表示匹配出name属性的值中不包含o的select节点。
特殊情况:
我们要匹配出input节点含有id属性的,写法如下://input[@id]
如果我们要匹配出input节点不含id属性的,则为://input[not(@id)]
XPath算数运算符
"""
启动Firefox,打开ECshop前台留言板页,点击留言类型里的第五个单选按钮,等待3秒,关闭浏览器
"""
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
driver = webdriver.Firefox() # 启动浏览器
driver.get('http://localhost/upload/message.php')
# 点击 留言类型 的第五个单选按钮 索引号大于4
driver.find_element(By.XPATH,'//input[@name="msg_type" and position()>4]').click()
sleep(3) # 等待3秒
driver.quit() # 关闭浏览器
XPath节点符号
XPath节点符号:是用来表示各个路径关系的符号
"""
打开ECshop前台登录页,等待3秒
点击左上角ECSHOP商标,等待3秒
点击精品推荐区里的第一个商品名称,等待3秒
点击 高级搜索 等待3秒
输入高级搜索页里的关键字806,等待3秒
点击左上角的ECSHOP商标,等待3秒
点击 查看购物车 等待3秒
关闭浏览器
"""
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
driver = webdriver.Firefox() # 启动浏览器
driver.get('http://localhost/upload/user.php')
sleep(3) # 等待3秒
driver.find_element(By.XPATH,'//a[@name="top"]/img').click()
sleep(3) # 等待3秒
driver.find_element(By.XPATH,'(//div[@id="show_best_area"]//img)[1]').click()
sleep(3) # 等待3秒
driver.find_element(By.XPATH,'//input[@id="keyword"]/../a').click()
sleep(3) # 等待3秒
driver.find_element(By.XPATH,'//*[@id="sc_ds"]/../../input[1]').send_keys('806')
sleep(3) # 等待3秒
driver.find_element(By.XPATH,'//a[@name="top"]/img').click()
sleep(3) # 等待3秒
driver.find_element(By.XPATH,'//*[@id="topNav"]/*[1]').click()
sleep(3) # 等待3秒
driver.quit() # 关闭浏览器
XPath轴
XPath轴(XPath Axes):可定义某个相对于当前节点的特定关系的节点集。
XPath轴指定上下文的节点和要选择节点的关系。
- 轴名称和含义
- XPath轴关系图
作者:暄总-tester