selenium--Xpath定位
前戏
前面介绍过了七种定位方式,今天来介绍最后一种,也是最强大,本人最常用的定位方式xpath
Xpath 即为 xml 路径语言,它是一种用来确定 xml 文档中某部分位置的语言。Xpath 基于 xml 的树状结构,提供在数据结构树中找寻节点的能力,html 也属于 xml
先来看一个简单的xpath定位
from selenium import webdriver
from time import sleep driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
sleep(3)
driver.find_element_by_xpath('//*[@id="kw"]').send_keys('selenium')
# //表示当前页面,@id="kw" 表示id为kw了
sleep(2)
driver.find_element_by_xpath('//*[@id="su"]').click()
sleep(2) driver.quit()
看起来是不是比较麻烦,为什么不通过id直接定位,因为在前端网页开发中,不是每个元素都有id属性的,或者id值是动态变化的。不能直接通过id定位,就要用到xpath定位了
被测网页HTML代码如下:

XPath绝对路径定位
查找第一个div标签下的“查询”按钮
driver.find_element_by_xpath('/html/body/div/inpu[@value="查询"]')
XPath相对路径定位
查找第一个div标签下的“查询”按钮
driver.find_element_by_xpath('//input[@value="查询"]')
//表示从匹配选择的当前节点开始选择文档中的节点,定位到value值为查询的input页面,使用@表明后面接的是属性
使用索引号定位元素
查找第一个div标签下的“查询”按钮
driver.find_element_by_xpath('//input[2]')
定位到第二个input标签,从1开始
使用页面元素的属性值定位元素
定位被测试网页中的第一张img元素
//img[@href='http://www.baidu.com']
//input[@type='button']
使用模糊属性值定位元素
页面上某些元素的属性值是动态生成的,也就是说每次访问的属性值都不一样,使用模糊属性值可以解决一部分此类问题,前提是属性中有一部分内容保持不变
查找属性alt的属性值以“div1”关键字开始的页面元素
//img[starts-with(@alt,'div1')]
查找alt属性的属性值包含“img”关键字的页面元素,只要包含即可,无须考虑位置
//img[contains(@alt,'img')]
实例:

上面页面中id值中后面的数字是动态变化的
fr = driver.find_element_by_xpath("//iframe[contains(@id,'x-URS-iframe')]")
driver.switch_to.frame(fr)
使用XPath轴(Axes)定位元素
先找到一个相对好定位的元素,让他作为轴,根据他和要定位的相对位置关系进行定位
| XPath轴关键字 | 轴的含义说明 | 定位表达式实例 | 表达式解释 |
| parent | 选择当前节点的上层父节点 |
//img[@alt='div2-img2']/parent::div
|
查找到属性alt的属性值为div2-img2的img元素并
基于该img元素的位置找到他上一级的div元素
|
| child |
选择当前节点的下层所有
子节点
|
//div[@id='div1']/child::img
|
查找到id属性值为div1的div元素,并基于该div
元素的位置找到他下层节点中的img元素
|
| ancestor | 选择当前节点所有上层的节点 |
//img[@alt='div2-img2']/ancestor::div
|
查找到属性alt的属性值为div2-img2的img元素
并基于该img元素的位置找到他上一级的div元素
|
| descendant |
选择当前节点所有下层的节点
(子,孙等)
|
//div[@name='div2']descendant::img
|
查找到属性name的属性值为div2的div元素并基于该元素的
位置找到他下级所有节点中的img页面元素
|
| following |
选择在当前节点之后显示的
所有节点
|
//div[@id='div1']/following::img
|
查找到id属性值为div1的div元素,并基于该div
元素的位置找到他后面节点中的img元素
|
| following-sibling |
选择当前节点后续所有
兄弟节点
|
//a[@href='http://www.sogou.com']/following-sibling::input
|
查找到链接地址为http://www.sogou.com的链接页面元素a,
并基于链接的位置找到它后续兄弟节点中的input页面元素
|
| preceding | 选择当前节点前面的所有节点 |
//img[@alt='div2-img2']/preceding::div
|
查找到属性alt的属性值为div2-img2的图片元素img,
并基于该图片元素的位置找到他前面节点中的div页面元素
|
| preceding-sibling |
选择当前节点前面的所有
兄弟节点
|
//input[@value='查询']/preceding-sibling::a[1]
|
查找到value属性值为“查询”的输入框页面元素
,并基于该输入框的位置找到它前面同级节点中
的第一个链接元素
|
有时候我们会在轴后面加一个星号(*),表示通配符,比如//input[@value='查询']/preceding-sibling::*,它表示查找属性value的值为“查询”的输入框input元素前面所有的同级元素,但不包括input元素本身
使用页面元素的文本定位元素
通过text()函数可以定位到元素文本包含某些关键字的页面元素
(1) //a[text()='搜狗搜索']
(2) //a[.='搜狗搜索']
(3) //a[contain(.,"百度")]
(4) //a[contain(text(),"百度")]
(5) //a[contain(text(),"百度")]/preceding::div
(6) //a[contain(.,"百度")]/..
pytho定位语句
driver.find_element_by_xpath("//a[text()='搜狗搜索']")
driver.find_element_by_xpath('//a[contain(text(),"百度")]/preceding::div')
表达式1和表达式2等价,都是查找文本内容为“搜狗搜索”的链接页面元素,使用的是精准定位,不能多也不能少
表达式3和表达式4等价,都是查找文本内容里包含“百度”关键字的链接页面,使用的是模糊匹配
表达式5和表达式6等价,都是查找文本内容里包含“百度”关键字的链接页面元素a的上层父元素div,表达式6最后使用了两个点,它表示选取当前节点的父节点,等价于preceding::div
xpath定位实例
实例一

先定位到name='wd'的标签上,..返回父级标签,也就是span标签,在找到span标签的a标签
实例二

//*[contains(@id,"cjm_dialog")]/div/div[2]/button[1]/span
实例三

//div[@class="hidden-columns"]/following-sibling::div[4]/div/table/tbody/tr[1]/td[12]/div/button[5]/span
实例四

//span[@class='el-input__suffix']/preceding-sibling::input[1]
实例五

//div[text()="溯源节点"]/../div/button/span/i
实例六

//label[text()="选项名称"]/following::div/div/input
实例七

//label[contains(text(),"单选1")]/following-sibling::div/div/div/input
实例八

//span[text()="所属机构"]/../following-sibling::div/span/input
selenium--Xpath定位的更多相关文章
- 自动化测试基础篇--Selenium Xpath定位
摘自https://www.cnblogs.com/sanzangTst/p/7458056.html 学习 什么是xpath? XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言 ...
- selenium xpath定位方式整理
#xpath定位元素方法: /html/body/div[2] #绝对路径定位 #相对路径定位元素 //* #找到所有的元素 //input #找到input元素 //*[@*] #表示有属性的所有元 ...
- selenium - xpath - 定位
前言: XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. 看这里介绍:w3school 首先来看一下xpath常用的语法: 一.xpath ...
- python selenium xpath定位方式
作者刚开始写博客,格式和语言方面难免存在问题,请大家海涵,如果有问题也请直接指出 xpath是一种在xm文档中定位的语言,详细简介,请自行参照百度百科,本文主要总结一下xpath的使用方法,个人看法, ...
- selenium之xpath定位和input文本
selenium之xpath定位和input文本 xpath简单定位: 打开浏览器的F12 在自己需要定位的元素的那里右键 选择copy->xpath selenium获取input下的文本: ...
- python+selenium基础之XPATH定位(第一篇)
世界上最远的距离大概就是明明看到一个页面元素矗在那里,但是我却定位不到!! selenium定位元素的方法有很多种,像是通过id.name.class_name.tag_name.link_text等 ...
- 用XPath精确定位节点元素&selenium使用Xpath定位之完整篇
在利用XSL进行转换的过程中,匹配的概念非常重要.在模板声明语句 xsl:template match = ""和模板应用语句xsl:apply-templates select ...
- Selenium+Java(四)Selenium Xpath元素定位
前言 关于Selenium元素定位,这是最后一篇博客. Xpath定位可以实现的功能 Selenium+Java(三)Selenium元素定位中讲的定位方式也可以实现,具体要用那种定位方式要根据自己的 ...
- selenium自学笔记---ecshop购买脚本 xpath定位元素(下拉框,单选框)
本机环境:xamppv3.2.1+ecshop3.0 1.元素定位写对,却一直报错,发现是页面元素加载的太慢,所以加上延时 from selenium import webdriverimport ...
- Python selenium PO By.XPATH定位元素报错
Python selenium PO By.XPATH定位元素报错 如下代码经常报错: # 首页的“新建投放计划”按钮 new_ads_plan = (By.XPATH, "//*[tex ...
随机推荐
- 死磕 java同步系列之volatile解析
问题 (1)volatile是如何保证可见性的? (2)volatile是如何禁止重排序的? (3)volatile的实现原理? (4)volatile的缺陷? 简介 volatile可以说是Java ...
- Unity mesh 合并
簡介: 基本上就是把 很多物體結合成一個物體 的作法,這種做法有很多優點,例如:1. 提高效能2. 統一材質 (只要建立一個材質,就能控制.分配給所有物體)3. 動畫控制方便 (像是你要在 Unity ...
- 洛谷P2505 [HAOI2012]道路(最短路计数)
传送门 早上模拟赛考这题,结果竟然看错题目了orz 然后下午看完题解自己做的时候空间开小了白WA了好久orz 首先,如果以$S$为起点,一条边$(u,v)$在最短路上,则$dis[u]+edge[i] ...
- 01 | VIM基础攻略
启动 vim 后,vim 处于 normal 模式. Step One: "i" -> insert 模式, ESC -> normal 模式: "x&quo ...
- swap(2018.10.16)
题意:给定一个{0,1,2,3,-,n-1}的排列 p. 一个{0,1,2 ,-,n-2}的排列 q 被认为是优美的排列, 当且仅当 q 满足下列条件 对排列 s={0,1,2,3,...,n-1}进 ...
- sQL存储过程的优缺点
目前具体的项目中没有使用sql存储过程,都用的封装好的框架,简单说下存储过程的优缺点. 优点: 1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编 ...
- java小游戏——猜数字
import java.util.ArrayList; import java.util.List; import java.util.Random; public class Num01 { sta ...
- flask 学习app代码备份
#!/usr/bin/python # -*- coding: UTF-8 -*- from flask import Flask, url_for from flask import request ...
- 119 Pascal's Triangle II 帕斯卡三角形 II Pascal's Triangle II
给定一个索引 k,返回帕斯卡三角形(杨辉三角)的第 k 行.例如,给定 k = 3,则返回 [1, 3, 3, 1].注:你可以优化你的算法到 O(k) 的空间复杂度吗?详见:https://leet ...
- 102 Binary Tree Level Order Traversal 二叉树的层次遍历
给定一个二叉树,返回其按层次遍历的节点值. (即zhu'ceng'de,从左到右访问).例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 ...