多语言展示
当前在线:971今日阅读:152今日分享:13

python实战006:find_element_by_xpath定位元素

Selenium提供了很多种定位DOM元素的方法,各有各的特点和优势,这里我大概列了下作用,webdriver就是通过定位这些DOM元素来找到我们想要控制的位置的。
方法/步骤
1

上面这几种方法中,by_id(),by_name() 比较容易使用,但是在我们的网页中这两个元素使用的不多,所以有这些属性的一般都可以直接使用这连个方法来定位。DOM元素中用的 比较多的事class类来定义的,这是我们可以使用by_class_name(),不过class也有个缺点,那就是一个类中会有多个属性值,并且多个位置都有,很难定位要准却的位置。by_link_text()和by_partial_link_text()在定位链接元素的时候用的比较多,当我们要查找某些带链接的标签时可以先考虑这两种方法,by_tag_name()定位标签元素,这个方法感觉很难准确定位到对应位置, 因为标签属性在DOM中很容易重复使用,by_css_selector()方法比较好用,我比较喜欢用这个,但是要注意元素层级较深的时候要从前面开始定位,不然会报错。

2

今天我们主要使用by_xpath()这个方法来定位元素,这个方法比较灵活方便,大部分属性都可以通过它来定位,当然因为太灵活了也不容易掌握。就拿我们自己写的平台来说吧,我们的前端是要哪个vue框架写的,大部分内容都是组件形式存在的,在我们选择,它并不是用selec元素来定义的,而是直接从列表中循环获取的。

3

我们从代码中可以看出,这些内容都在同一个ul中的li中,class类名也一样,标签也一样,span中没有任何属性,唯一不同的就是span中的值不同,这时候by_name()、by_id()、by_class_name()、by_tag_name()、by_link_text()、by_partial_link_text()、by_css_selector()都没法定位到相应的元素,这是by_xpath()的强大就体现出来了。

4

by_xpath好处就是可以一层层定位下来,知道找到我们想要的元素,/代表根目录,每一层我们用/区分,直接找到我们的元素,比如/html/body/div/ul/li/span........,当然这缺点也明显,那就是层级太深了那么对应的路径就会很长很长,下图是我们首页的层级关系,首页内容不多就已经这么长了。

5

所以这里我们一般都不适用绝对定位来查找属性,而是相对定位,用//区分,表示从当前节点开始寻找所有的后代元素,让相同元素比较多时,我们可以给当前元素加上属性来缩小定位范围,方法是在元素后面加上【@+元素内容】,这里我为了定位准确在li后面加了class属性,这样就指定到了当前的列表中了,然后再根据span的值来判断我们要了。driver.find_element_by_xpath('//li[@class='el-select-dropdown__item']/span[text()=\'\']').click()

6

除了定位到属性,我们也可以使用一些通用属性来快速定位元素,/* 指某元素下的所有元素,当有多个元素时可以在元素后面加[id]指定位到第几个元素,我这个也可以直接定位第几个span,只是由于这里面的数据并不固定,所以定位下标并不能准确找到想要的元素。

推荐信息