1、通过绝对路径定位
绝对路径的开头是一个斜线(/),从网页的根节点html开始,逐层去查找需要的定位元素。
此方案缺点显而易见,当页面元素位置发生改变时,都需要修改,因此,并不推荐使用
举例:百度搜索框绝对路径定位
#绝对路径 ‘/‘ 遇到同层级多个元素用下标表示,下标从1开始 自顶向下写
# driver.find_element_by_xpath(‘/html/body/div[1]/div[1]/div[5]/div[1]/div[1]/form/span/input‘).send_keys(‘博客园‘)
备注:
当同一层有多个相同的元素时,使用下标区分,下标从1开始
2、通过相对路径定位
相对路径的开头是两个斜线(//),表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同的层级也会被选出来
举例:百度搜索框相对路径定位
#相对路径 ‘//‘ 经验 自低向上尝试
# driver.find_element_by_xpath(‘//span[1]/input‘).send_keys(‘博客园‘)
# driver.find_element_by_xpath(‘//form/span[1]/input‘).send_keys(‘博客园‘)
备注:
以上都可以定位到百度搜索框,相对路径的长度和开始位置并不受限制,可以采用从后往前逐层定位直到定位到即可的方式去定位
3、通过元素索引定位
遇到同层级相同标签元素时,可以使用索引(下标)表示,索引的初始值为1
举例:定位百度hao123链接
#通过元素索引定位,遇到同层级相同标签元素时,可以使用索引(小标)表示,索引初始值为1
# driver.find_element_by_xpath(‘//div[1]/div[1]/div[5]/div[1]/div[1]/form/span/input‘).send_keys(‘博客园‘)
4、使用元素属性定位
元素属性定位要求属性能够定位到唯一一个元素,如果存在多个相同条件的标签,默认定位第一个,具体格式 //标签名[@属性=“属性值”]
支持使用and 和 or关键字,多个属性一起定位元素
举例:
#属性定位 //标签名[@属性=“属性值”]
# driver.find_element_by_xpath(‘//input[@id="kw"]‘).send_keys(‘博客园‘)
# driver.find_element_by_xpath(‘//input[@maxlength="255"]‘).send_keys(‘博客园‘)
#多属性定位 and or
# driver.find_element_by_xpath(‘//input[@id="kw" and @maxlength="255"]‘).send_keys(‘博客园‘)
# driver.find_element_by_xpath(‘//input[@is="kw" or @maxlength="255"]‘).send_keys(‘博客园‘)
备注:
Xpath支持通配符*号,通过属性定位还可以如下写法:
#支持通配符 *
# driver.find_element_by_xpath(‘//*[@*="kw"]‘).send_keys(‘博客园‘)
5、使用部分属性值匹配(也成为模糊方法定位)
属性值如果太长或网页中的元素属性动态变化,可以使用此方法
元素属性值开头包含内容:starts-with()
#模糊定位、称为部分属性值定位
#starts-with() 字符串以特定值开头 下方a表示标签名
# driver.find_element_by_xpath(‘//a[starts-with(@href,"http://news")]‘).click
#报错原因ends-with() 是xpath语言2.0版本的函数 而当前xpath是xpath1.0版本的语言
#//a[ends-with(@href,"news.baidu.com")]‘ is not a valid XPath expression.
# driver.find_element_by_xpath(‘//a[ends-with(@href,"news.baidu.com")]‘).click()
元素属性值结尾包含内容:substring()
#substring() 元素属性值结尾包含内容 http://news.baidu.com
# driver.find_element_by_xpath(‘//a[substring(@href,8)="news.baidu.com"]‘).click()
元素属性值结尾包含内容:contains()
#contains() 包含
# driver.find_element_by_xpath(‘//a[contains(@href,"news.baidu")]‘).click()
#应用 1、元素信息过长 2、动态属性元素 订单 取第一个订单点击 order_001 order_002 order_003
备注:
Xpath1.0没有ends-with函数,2.0有,现在浏览器实现的都是1.0
6、使用元素文本定位
元素文本在xpath中可以通过text()函数获取,也可以用其来进行元素定位。
#元素文本定位
#text()
# driver.find_element_by_xpath(‘//a[text()="新闻"]‘).click()
#元素模糊定位
# driver.find_element_by_xpath(‘//a[contains(text(),"新")]‘).click()