Selenium-xpath定位
序⾔:
前⾯介绍了利⽤浏览器的debug⼯具获取xpath地址,但是这个⼯具不是万能的,有时候直接复制粘贴会定位不到。这个时候就需要⾃⼰⼿动去写xpath路径了。接下来将详细讲解xpath的常⽤语法。
⼀、xpath的基本概念和基本语法
谓语(Predicates)
xpath语法 python谓语⽤来查某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在⽅括号中。
⼆、下⾯我们开始介绍xpath的⼀些常⽤定位⽅法
语法:xpath = "//标签名[@属性='属性值']"
1. 属性定位
(1)通过id属性定位
driver.find_element_by_xpath('//*[@id="kw"]')
(2)通过name属性定位
element = driver.find_element_by_xpath('//*[@name="wd"]')
(3)通过class属性定位
element = driver.find_element_by_xpath('//*[@class="s_ipt"]')
(4)通过⽂本信息定位或autocomplete属性等定位。
element = driver.find_element_by_xpath('//*[@autocomplete="off"]')# 通过autocomplete属性定位
element = driver.find_element_by_xpath('//*[text()="hao123"]')# 通过⽂本信息定位
(5)属性判断条件中最常见为id,name,class等等,属性的类别没有特殊限制,只要能够唯⼀标识⼀个元素即可。当然在属性不唯⼀的时候,如果采取多个条件组合的⽅式能达到唯⼀也可以。xpath的逻辑运算可以⽀持与(and)、或(or)、⾮(not),以下代码以and作为例⼦:
element = driver.find_element_by_xpath('//*[@id="kw" and @autocomplete="off"]')
注释:与(and):A and B,即既满⾜A条件同时也满⾜B条件才成⽴,⽐如,上⾯⽤例中的@id="kw" and @autocomplete="off",只有当id为“kw”,并且autocomplete为“off”时才可定位到。
或(or): A or B,只要满⾜A条件或者满⾜B条件就可成⽴,即A和B两个条件只要满⾜其中⼀个就成⽴。
⾮(not):not A,只要不满⾜A条件就成⽴。
2. 标签定位
有时候同⼀个属性,同名的⽐较多,这时候可以通过标签筛选,定位更精准⼀点。这个时候我们可以结合上⾯的xpath路径基本语法进⾏定位,⽐如常⽤到的/号表⽰从根节点开始,//号表⽰从匹配到的元素作为开始节点,⽤*号表⽰任意标签等,以下均以定位hao123为例。
(1)/号表⽰从根节点开始定位,其中[N]表⽰跟它的标签⼀样兄弟元素的第N个(注意:Xpath的索引是从1开始,不同于python语法的索引从0开始)
element = driver.find_element_by_xpath("/html/body/div/div/div[3]/a[2]")# 从根路径开始定位,其中div[3]表⽰此⽤例中/html/body/div/div/路径下的第3个div标签。
注释:⼀个元素⽆法通过⾃⾝属性直接定位到,则可以先定位它的⽗(或⽗节点的⽗节点,即它爷爷)元素,然后再下⼀级即可,⽐如以上⽤例的body节点,它的⽗节点即为html。
(2)//号表⽰从匹配选择的当前节点开始定位
# 以下两个定位⽅法均可定位到hao123,放两个例⼦只是为了强调元素属性可在xpath路径任意节点添加。
element = driver.find_element_by_xpath("//div[@id='s-top-left']/a[2]")# 从满⾜id为“s-top-left”的div标签开始定位。
element = driver.find_element_by_xpath("//a[text()='hao123']")# 从满⾜⽂本信息为“hao123”的a标签定位。
(3)*号表⽰从匹配选择的当前节点开始定位
# 以下两个定位⽅法均可定位到hao123,放两个例⼦只是为了强调*可表⽰xpath路径的任意节点。
element = driver.find_element_by_xpath("//div/*[text()='hao123']")# 定位⽂本信息为“hao123”的所有元素。
element = driver.find_element_by_xpath("//*[text()='hao123']")# 定位⽂本信息为“hao123”的所有元素。
3. 模糊匹配定位
模糊匹配功能⾮常强⼤,掌握了模糊匹配功能,基本上没有定位不到的。以下为模糊定位的常⽤⽅法:
# xpath语法⽀持模糊匹配某个属性
element = driver.find_element_by_xpath("//a[contains(text(),'ao12')]")
element = driver.find_element_by_xpath("//*[contains(@id,'kw')]")
# xpath语法⽀持模糊匹配以什么开始的
element = driver.find_element_by_xpath("//a[starts-with(text(),'hao12')]")
element = driver.find_element_by_xpath("//input[starts-with(@id,'k')]")
# xpath语法⽀持模糊匹配以什么结尾的
element = driver.find_element_by_xpath("//input[ends-with(@id,'w')]")# ends-with是xpath2.0的语法
element = driver.find_element_by_xpath("//input[substring(@id,string-length(@id)-string-length('w')+1)='w']")# 此为xpath1.0的语法
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论