Pythonselenium根据class定位页⾯元素,xpath定位
在⽇常的⽹页源码中,我们基于元素的id去定位是最万⽆⼀失的,id在单个页⾯中是不会重复的。但是实际⼯作中,很多前端开发⼈员并未给每个元素都编写id属性。通常⼀段html代码如下:
1 <div class="sui-tips s-isindex-wrap sui-tips-exceedtipnews" ><div class="sui-tips-arrow" ><em>
</em></div><div class="sui-tips-body">今天召唤我太多次啦,<br>明天再来调教⼩度吧!`(*∩_∩*)′</div></div>
这个例⼦中,最外层的div就没有id属性,此时,可以基于class属性来定位元素。常见的基于class定位元素的selenium写法如下:
⼀、
driver.find_element_by_class_name("classname")
但是好多时候,很多并列的元素如list表单,class都是共⽤同⼀个,如:
此时driver.find_elements_by_class_name("classname") 就可以派上⽤场了,该⽅法可以返回的是⼀个list列表,那么所有针对list的⽅法在它上⾯都同样适⽤。⽐如,如果我们知道想要定位的元素在页⾯中是第n个,则可以这样定位:
⼆、
driver.find_elements_by_class_name("classname")[n] (注意:是elements,不是element)
需要注明的是,使⽤上述⽅法,即使这⽹页中样的元素只有⼀个,得到的依旧是⼀个list对象,只不过长度为1.
当然如果你对css⽅法⽐较熟悉,还可以通过css来定位,selenium同样是⽀持的,css中,"."后⾯跟class名即可,⼀个常规的写法如下:三、
driver.find_element_by_css_selector('.dtb-style-1').click()
如果你的例⼦⾜够特殊,这个元素的classname有多个,上⾯的⽅法还可以⽤多个"."进⾏并⾏连接。如:
driver.find_element_by_css_selector('.dtb-style-1.table-dragColumns').click()
还有⼀种⽅法同样可以⽀持多个类的情况,还是css属性⽅法:
driver.find_element_by_css_selector("[class='dtb-style-1 table-dragColumns']") ⽤空格分隔即可。
如果你对css属性不熟悉的话,也不打紧,强⼤的Chrome浏览器能⾃动帮你⽣成元素的xpath、css等多种属性。拿百度⾸页的源码举例,在页⾯源码⽂件,定位到元素后,右键,效果如下:
cssclass属性
⽣成的代码复制后,针对此场景可以直接拿来⽤,但是鉴于现在的⽹页更新⾮常频繁,建议还是要在w3c下简单学习下xpath、css selector等重要⽅法,那样我们可以写出⾮常灵活的代码,对页⾯的细微调整会有更强的适应性。
最后,我们还可以通过强⼤的xpath来定位元素,如果元素有多个class,我们只⽤选择其中⼀个放⼊xpath中即可,否则程序会出错。⽰例如下:
四、
driver.find_element_by_xpath('//div[@class="u_sp"]/a[1]').click()
这么多⽅法中,xpath是最最灵活的,因为xpath内置了很多函数,在某些场合中你可能就需要依靠这种灵活性,"灵活"就不可避免的会带来复杂性。尽管如此,笔者还是⿎励你们,在实际⼯作中,每种定位元素的⽅法都要学会,很多时候,你会发现你精⼼写的⽅法⼀不⼩⼼就不灵了,这个时候掌握多种定位⽅法,就显得尤为重要了。
有了这些技能,从此在python selenium的世界⾥,基于class属性定位元素将显得so easy。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论