XPath

  • XPath全称是XML PATH(XML路径语言),是在XML文档里使用路径表达式来描述目标节点的一种技术,属于一个前端开发技术

XML

  • 叫做可扩展标记语言
  • 它是对HTML的扩展,所有的标记以及标记的属性都可以自己定义
  • XML的设计宗旨是传输数据,而不是显示数据,所以XML标间没有被预定义,需要自行定义标签XPath
  • 书店数据用XML格式表示:

XPath和XPath表达式

XPath是一种在XML文档里查找信息的一种语言,可以用来在XML文档中对元素及其属性进行搜索查找

XPath表达式是描述XML节点所在路径的表达式,用来选取XML文档中的节点或节点集

XPath表达式

树形结构是交互设计中的基础组件,可用清晰的层级结构来展示层级信息,便于用户根据数据之间的关系来逐级找到相应的节点及数据

XPath表达式示例:/书店/图书[1]/书名

Selenium08--XPath定位_XML

XPath在HTML中使用

由于HTML文档本身遵循XML页面的语法规则,所以可以使用XPath来定位页面元素

HTML文档树形结构:

Selenium08--XPath定位_XML_02

XPath表达式可以用来描述HTML网页里的网页元素所在的路径

示例:/html/body/div/a

Selenium08--XPath定位_XML_03

为什么要使用XPath定位
  • selenium测试目标就是HTML格式的网页,HTML语法与XML接近,所以XPath技术也可以适用于在HTML网页里查找元素

  • 描述元素所在的路径可以使用XPath表达式

  • WebDriver里提供XPATH定位,来使用XPath表达式进行页面元素的定位

    # 语法
    变量 = driver.find_element(By.XPATH,'XPath表达式')
获得XPath表达式
  • Firefox浏览器自带工具:
    • Web开发者 → 查看器 → 目标元素代码 → 复制 → XPath
    • Selenium08--XPath定位_HTML_04


Selenium08--XPath定位_XML_05

"""
启动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() # 关闭浏览器

Selenium08--XPath定位_XML_06

"""
启动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表达式写法
    • Selenium08--XPath定位_XML_07


  • XPATH表达式分为两种

    • 绝对路径:从最顶层节点(根节点)开始描述,向下层一层一层进行路径的描述,对于HTML网页来说,html就是根节点,以/html或html开头
    • Selenium08--XPath定位_HTML_08

    • 相对路径:不从最顶层节点开始描述,从中间某层开始描述或直接描述目标,以//开头,建议使用,可维护性好
    • Selenium08--XPath定位_XML_09

谓词

也叫做筛选表达式或过滤表达式,用于附加筛选的条件,从节点中筛选出满足条件的节点

谓词的作用:使定位更加精准

谓词的语法:[筛选条件]

  • 谓词的中括号可以写在各个层级的标记名称之后
  • 筛选条件用于对节点进一步说明和限定
  • Selenium08--XPath定位_XML_10


"""
打开首页,输入关键字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提供了函数库为我们提供功能丰富的各种函数的调用

函数分类:

  • 节点函数
  • 字符串函数
  • 布尔函数
  • 数值函数
  • Selenium08--XPath定位_XML_11


XPath里的常用函数

Selenium08--XPath定位_XML_12

  • last函数
  • 返回同父同标记的兄弟节点节点总个数(也就是最后一个节点索引号),可以用于选择倒数第几个节点。
  • 例1://li[@id='topNav']/a[last()] 选择最后一个a节点
  • 例2://li[@id='topNav']/a[last()-1] 选择倒数第二个a节点
  • Selenium08--XPath定位_html_13

  • position函数
  • 返回指定值所表示的节点的位置(当前节点的索引号),选择当前的第几个节点。
  • 例1://li[@id='topNav']/a[position()<2]
  • Selenium08--XPath定位_HTML_14

  • text函数
  • 获得一个节点的文本值,无参。
  • 说明:适用于任何有文本的双标记节点。
  • 示例:
  • 例1://a[text()='选购中心'] 可以匹配文本是'选购中心'的超级链接
  • Selenium08--XPath定位_html_15

  • contains函数
  • 用来判断str1是否包含str2,其中str1一般是@属性名或text()。
  • 示例:
  • 例1://a[contains(text(),'高级')] 表示选择文本值里包含'高级'的a节点。
  • 例2: //input[contains(@id,'key')] 表示选择id中包含有'key'的input节点。
  • Selenium08--XPath定位_HTML_16

  • starts-with函数
  • 用来判断str1是否以str2开头,返回布尔值,其中str1一般是@属性名或text()。
  • 示例:
  • 例1://input[starts-with(@id,'sc')] ,选择以'sc'开头的id属性的input节点
  • Selenium08--XPath定位_HTML_17

  • not函数
    not()函数表示否定,取反,一个参数。常与返回值为布尔值的函数组合起来用,比如contains(),starts-with()等。
    示例:
    例1://select[not(contains(@name,'o'))]表示匹配出name属性的值中不包含o的select节点。
    特殊情况:
    我们要匹配出input节点含有id属性的,写法如下://input[@id]
    如果我们要匹配出input节点不含id属性的,则为://input[not(@id)]

XPath算数运算符

Selenium08--XPath定位_HTML_18


Selenium08--XPath定位_HTML_19


Selenium08--XPath定位_HTML_20

"""
启动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节点符号:是用来表示各个路径关系的符号

Selenium08--XPath定位_HTML_21

"""
打开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轴指定上下文的节点和要选择节点的关系。

Selenium08--XPath定位_HTML_22

  • 轴名称和含义
  • Selenium08--XPath定位_XML_23


  • XPath轴关系图
  • Selenium08--XPath定位_html_24


作者:暄总-tester