python实战006:find_element_by_xpath定位元素

时间:2024-10-15 04:31:44

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

python实战006:find_element_by_xpath定位元素

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

python实战006:find_element_by_xpath定位元素

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()的强大就体现出来了。

python实战006:find_element_by_xpath定位元素

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

python实战006:find_element_by_xpath定位元素

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

python实战006:find_element_by_xpath定位元素

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

python实战006:find_element_by_xpath定位元素

7、//模拟登录源码from selenium import webdriverfrom time 坡纠课柩import sle髫潋啜缅epoption =webdriver.ChromeOptions()option.add_argument(r'--user-data-dir=C:\Users\ST-C18110032L\AppData\Local\Google\Chrome\User Data')driver=webdriver.Chrome(chrome_options=option)driver.get("http://localhost:8080/#/login")driver.find_element_by_css_selector('input[type="text"]').send_keys('M0001')driver.find_element_by_css_selector('input[type="password"]').send_keys('123456')driver.find_element_by_css_selector('input[class="el-input__inner"]').click()sleep(2)driver.find_element_by_xpath("//li[@class='el-select-dropdown__item']/span[text()=\"超級公司\"]").click()driver.find_element_by_css_selector('input[type="button"]').click()

python实战006:find_element_by_xpath定位元素
© 手抄报圈