selenium11-XPath元素定位的方法

XPath是一种十分强大的定位元素的方法,XPath定位和CSS定位相比有更大的灵活性。本篇文章的重点主要讲解“xpath元素定位的基本方法”,希望感兴趣的小伙伴可以坚持看下去同时欢迎提出宝贵的意见让我们一起进步!

01:XPath简单介绍

1)概述:XPath(XML Path Language)是W3C定义的用来在XML文档中选择节点的语言。

2)支持:主流浏览器(Chrome、Firefox,Edge,Safari)也支持XPath语法

3)特点:语法非常像Linux系统中的路径,所以又叫做路径表达式

4)场景:XPath有从当前节点选择父节点的功能,这是CSS selector所不具备的

前置条件:
from selenium import webdriver
driver=webdriver.Chrome()
driver.implicitly_wait(5)
driver.get('https://www.51job.com/')
02:XPath语法结构

1)绝对路径:从根节点(html)开始, 路径分割符是/,类似css中的>符号。如:/html/body/div

2)相对路径:以//开头后面加元素名称, 用法类似于css中的后代选择器。//表示从当前节点寻找所有的后代元素,不管它在什么位置。如://span

3)组合使用://div/p/span

4)通配符:*,表示匹配所有元素。

5)用法://div/* ;表示匹配div下面所有元素

(1)绝对路径写法:选择html文档对应路径下的div元素
div=driver.find_elements_by_xpath('/html/body/div')
(2)相对路径写法:选择html文档下所有的div元素
div=driver.find_elements_by_xpath('//div')
(3)组合路径写法:p和span分别属于div元素的子元素与孙元素
div=driver.find_elements_by_xpath('//div/p/span')
(4)通配符写法:匹配div下面所有元素
div=driver.find_elements_by_xpath('//div/*')
03:根据属性选择

1)使用场景:选择具有某个属性(值)的元素

2)表示方法:属性前面加一个[@属性],属性值必须加引号

①//*[@属性] 表示选择具有某个属性的元素

②//*[@属性=“属性值”] 表示选择具有某个属性值的元素,属性值必须加引号(单引号双引号都可以)

包含某(value)属性:/*[contains(@属性,“value”)]

某属性以value开头://*[starts-with(@属性,“value”)]

某属性以value结尾://*[ends-with(@属性,“value”)]

多属性组合使用://*[@属性=“属性值”][@属性=“属性值”]

and和or组合使用://*[@属性=“属性值”or/and@属性=“属性值”]

3)注意事项:在xpath中没有表示id和class的特殊方法,id 、class 也是属性

(1)根据id属性选择
div=driver.find_elements_by_xpath('//div/p/input[@id="kwdselectid"]')
(2)根据class属性选择
div=driver.find_elements_by_xpath('//div/p[@class="ipt"]')
(3)包含ufm属性的元素
div=driver.find_elements_by_xpath('//div[contains(@class,"ufm")]')
(4)以ufm属性开头的元素
div=driver.find_elements_by_xpath('//div[starts-with(@class,"ufm")]')
(5)多属性组合使用
div=driver.find_elements_by_xpath('//iframe[@name="login_iframe"][@onload="load()"]')
(6)and和or的使用
div=driver.find_elements_by_xpath('//input[@type="hidden" or @id="showguide"]')符合其中一个
div=driver.find_elements_by_xpath('//input[@type="hidden" and @id="showguide"]')两者都符合
04:根据子元素选择-单选

1)表示方法:如//ul[@id="languagelist"]/li[1],若不写元素类型可以直接写*(通配符)

正数第一个://*[@属性=“属性值”]/元素[n]或者“[n]等价于[position()=n]”

倒数第一个://*[@属性=“属性值”]/元素[last()]或者“[last()]等价于[position()=last()]”

倒数第二个://*[@属性=“属性值”]/元素[last()-1]或者“[last()-1]等价于[position()=last()-1]”

2)使用场景:选择属于其父元素的第n个某个类型的子元素

(1)定位ul下的正数第一个li元素
li=driver.find_elements_by_xpath('//ul[@id="languagelist"]/li[1]')
li=driver.find_elements_by_xpath('//ul[@id="languagelist"]/li[position()=1]')
(2)定位ul下的倒数第一个li元素
li=driver.find_elements_by_xpath('//ul[@id="languagelist"]/li[last()]')
li=driver.find_elements_by_xpath('//ul[@id="languagelist"]/li[position()=last()]')
(3)定位ul下的倒数第二个li元素
li=driver.find_elements_by_xpath('//ul[@id="languagelist"]/li[last()-1]')
li=driver.find_elements_by_xpath('//ul[@id="languagelist"]/li[position()=last()-1]')
05:根据子元素选择-多选

1)表示方法:如//ul[@id="languagelist"]/li[position()=last()-1]

前2个://*[@属性=“属性值”]/元素[position()<3]

除了最后1个://*[@属性=“属性值”]/元素[position()<last()]

2)使用场景:选择属于其父元素的第m到n之间某个类型的子元素

(1)定位ul下的前2个li元素
li=driver.find_elements_by_xpath('//ul[@id="languagelist"]/li[position()<3]')
(2)定位ul下的除了倒数第一个li元素(最后一个元素之前的元素)
li=driver.find_elements_by_xpath('//ul[@id="languagelist"]/li[position()<last()]')
06:根据组选择元素

1)表示方法:<s1>|<s2>;<s1>和<s2> 是两组xpath选择器

2)使用场景:用于多组xpath表达式组合来选择元素的情况

3)注意事项:css和xpath的表达式不能混用

ele=driver.find_elements_by_xpath('//ul[@id="languagelist"]/li[1]|//div[@class="app"]')
07:根据相邻兄弟选择元素

1)表示方法:如//div[@class="app"]/following-sibling::div

①选择后面的兄弟元素://*/following-sibling::

②选择前面的兄弟元素://*/preceding-sibling::

2)使用场景:根据同级元素选择其他的同级元素

(1)选择后面的兄弟元素
ele=driver.find_elements_by_xpath('//div[@class="app"]/following-sibling::div')
ele=driver.find_elements_by_xpath('//div[@class="app"]/following-sibling::div[1]')
(2)选择前面的兄弟元素
ele=driver.find_elements_by_xpath('//div[@class="app"]/preceding-sibling::div')
ele=driver.find_elements_by_xpath('//div[@class="app"]/preceding-sibling::div[1]')
(3)选择距离li元素最远的兄弟元素
ele=driver.find_elements_by_xpath('//div[@class="app"]//following-sibling::li[last()]')
(4)选择li元素后面第2个到最后一个的兄弟元素
ele=driver.find_elements_by_xpath('//div[@class="app"]//following-sibling::li[position()>1]')
08:根据父元素选择

1)表示方法://p/.. ;选择p的父元素

2)使用场景:根据子元素定位父元素

ele=driver.find_elements_by_xpath('//div[@class="app"]/..')
09:调用当前webelement内部使用XPath小技巧(.)

如果是从当前webelement调用find_element_by_xpath,需要在表达式前面加个相对路径点“.”

div=driver.find_element_by_id('many')
ele=div.find_elements_by_xpath('.//*[@class="special"]')
10:验证XPath方法

①打开控制台,element标签内查找,会做字符匹配。比如:/html/body/div

②打开控制台,console内查找,更精确。比如:$x('/html/body/div')

XPath-element标签内查找.png
XPath-console内查找.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350