目录
XPath说明
概念
(1)XML:可扩展的标记语言,是对HTML的扩展,基本语法与HTML一样,只是标记和标记的属性都可以自己根据业务来定义,开发人员经常用XML来做配置文件。
(2)XPath:XML Path,是XML路径语言,XPath表达式可以用于描述在XML文档里查找一个节点(理解为一个元素)或节点集(理解为多个元素)的路径表达式。
(3)说明:因为HTML可以看做一种特殊的XML文件,所以XPath这种技术也可以用于在HTML网页里查找页面元素。
XPath定位的语法
(1)语法一:driver.find_element_by_xpath("xpath表达式")
(2)语法二:导入By后,driver.find_element(By.XPATH,"xpath表达式")
# 输入留言内容:hello
driver.find_element(By.XPATH,"//textarea").send_keys("hello")
利用一些工具来生成xpath表达式
(1)Chrome浏览器:启动Chrome---打开目标网页---目标元素右击菜单里选择“检查”---在网页源代码目标行右击菜单里选择Copy下Copy Xpath
(2)Selenium IDE:录制目标元素的操作步骤---选中这个步骤---下方代码编辑区Target(目标)下拉列表里选择xpath字样的选项
(3)其他工具:Firefox的FirePath插件,Firefox的XPath Finder插件、Firefox的Try XPath插件、最新版本的Firefox……
xpath表达式分类
(1)绝对路径xpath表达式:从根节点开始描述,比如网页里根节点就是html标记,不建议使用!可维护性差。
/html/body/div[1]/div[1]/a/img
html/body/div[1]/div[1]/a/img
(2)相对路径xpath表达式:不从根节点开始描述,以//或.//开头,更建议使用!
//*[@id="ECS_MEMBERZONE"]/a[1]/img
元素和xpath表达式的关系:多对多关系
(1)一个元素可能有多种xpath表达式的写法。
(2)一个xpath表达式可能能查找到多个元素。
xpath语法:相对路径xpath表达式
(1)最简单的xpath表达式://后直接写目标元素的标记,就可以在整个网页里查找这种标记的元素,等价于tag name定位的效果。
//a #查找到网页里所有的超级链接
//input #查找所有的文本框、按钮、单选按钮、复选框
//textarea #查找所有的文本域
(2)如果直接查找目标元素不准确,可以用/分隔,前面先找它的父元素,如果还不准确,还可以继续加上一级或上上级……
#高级搜索
//form/a
//div/form/a
(3)谓词:描述筛选条件,用 [ ] 来表示,写在标记名称后,功能类似于SQL里的where子句,各个级别的标记名称后都可以加谓词。
(4)[索引号]:筛选兄弟关系节点同标记的元素中第几个,索引号从1开始编号。
//tr[last()]/td/div/i
//div[3]/span/button/span
//i[2]
//tr[last()]/td/div/i[2]
(5)[@属性名称='属性值']:筛选属性值等于特定字符串的元素。
#点击餐饮商家
//div[@id='app']/section/section/section/aside/div/ul/li[2]/span
//ul[@class='el-menu-vertical-demo leftmenu el-menu']/li[2]/span
//ul[@role='menubar']/li[2]/span
#如果有value值或者herf等其他值,也可以使用
//input[@value='1']
//input[@name='user_email']
//input[@value='餐饮商家'] #模拟
//a[@href='user.php']/img
(6)last函数:无参,返回兄弟关系节点中同标记的节点中最后一个节点的索引号,索引号从1开始,所以最后一个的索引号就是总个数,一般用于索引号较大的情况。
[last()]
#选择最后一个tr
//tr[last()]/td/div/i
#选择倒数第四个
//ul[@role='menubar']/li[last()-3]/span
(7)text函数:无参,返回当前节点的开始标记和结束标记之间的完整文本。等价于link text定位
//li[text()='公交管理']
(8)contains函数:有2个参数,用来判断第1个参数值是否包含第2个参数值,一般第1个参数值是text()或@属性名称,第2个参数是一个字符串。等价于partial link text定位
//li[contains(text(),'公交')] #包含“公交”两个字
//img[contains(@src,'bnt_log')] #img,src属性值里包含“bnt_log”,只输入部分,不是全部
//a[contains(@href,'advanced')] #href属性值里包含“advanced”的超级链接
(9)符号:
a. 父/子,必须逐级书写。
b. //开头,代表在整个网页里查找某标记的元素,其实是//前面默认有根节点的标记,//不仅可以写在开头,也可以写在表达式中间,祖先//后代,也就是可以跳级查找。
//div/form/select
//div//select
c. /.. 通过子找到唯一的父
//option[text()='所有分类']/.. #通过选项找到下拉列表
//a[text()='高级搜索']/../input[2] #通过高级搜索找到搜索按钮
//option[text()='所有分类']/../../input[2] #通过选项找到下拉列表、再找到表单、最后找到搜索按钮
d. * 通配符,可以匹配任何字符串,用*代表标记名写在/或//后表示任意标记名称,用*代表属性名称写在@后表示任意属性名称。
//*[text()='所有分类']
//*[@*='top']/*