python实战006:find_element_by_xpath()定位DOM元素

部署运行你感兴趣的模型镜像

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

find_element_by_id                //通过id查找单个元素
find_element_by_name              //通过name查找单个元素
find_element_by_xpath             //通过xpath查找单个元素
find_element_by_link_text         //通过链接查找单个元素
find_element_by_partial_link_text //通过部分链接查找单个元素
find_element_by_tag_name          //通过标签名称查找单个元素
find_element_by_class_name        //通过类名查找单个元素
find_element_by_css_selector      //通过css选择武器查找单个元素
find_elements_by_name             //通过name查找多个元素
find_elements_by_xpath            //通过xpath查找多个元素
find_elements_by_link_text        //通过链接查找多个元素
find_elements_by_partial_link_text//通过部分链接查找多个元素
find_elements_by_tag_name         //通过标签名称查找多个元素
find_elements_by_class_name       //通过类名查找多个元素
find_elements_by_css_selector     //通过css选择武器查找多个元素

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

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

         我们从代码中可以看出,这些内容都在同一个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()的强大就体现出来了。

<ul class="el-scrollbar__view el-select-dropdown__list">
    <li data-v-37fc0e6c="" class="el-select-dropdown__item hover"><span>1公司</span></li>
    <li data-v-37fc0e6c="" class="el-select-dropdown__item"><span>2公司</span></li>
    <li data-v-37fc0e6c="" class="el-select-dropdown__item"><span>3公司</span></li>
    <li data-v-37fc0e6c="" class="el-select-dropdown__item"><span>4公司</span></li>
    <li data-v-37fc0e6c="" class="el-select-dropdown__item"><span>5公司</span></li>
    <li data-v-37fc0e6c="" class="el-select-dropdown__item"><span>6公司</span></li>
    <li data-v-37fc0e6c="" class="el-select-dropdown__item"><span>7公司</span></li>
</ul>

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

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

driver.find_element_by_xpath("//li[@class='el-select-dropdown__item']/span[text()=\"超級公司\"]").click()

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

//模拟登录
from selenium import webdriver
from time import sleep

option =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()

以下是selenium的其他操作方法,参考博客:https://blog.youkuaiyun.com/eastmount/article/details/48108259

//属性值获取
size 获取元素的尺寸
text 获取元素的文本
get_attribute(name) 获取属性值
location 获取元素坐标,先找到要获取的元素,再调用该方法
page_source 返回页面源码
driver.title 返回页面标题
current_url 获取当前页面的URL
is_displayed() 设置该元素是否可见
is_enabled() 判断元素是否被使用
is_selected() 判断元素是否被选中
tag_name 返回元素的tagName

//元素操作   
clear 清除元素的内容
send_keys 模拟按键输入
click 点击元素
submit 提交表单

//鼠标操作
context_click(elem) 右击鼠标点击元素elem,另存为等行为
double_click(elem) 双击鼠标点击元素elem,地图web可实现放大功能
drag_and_drop(source,target) 拖动鼠标,源元素按下左键移动至目标元素释放
move_to_element(elem) 鼠标移动到一个元素上
click_and_hold(elem) 按下鼠标左键在一个元素上
perform() 在通过调用该函数执行ActionChains中存储行为

//键盘操作
send_keys(Keys.ENTER) 按下回车键
send_keys(Keys.TAB) 按下Tab制表键
send_keys(Keys.SPACE) 按下空格键space
send_keys(Kyes.ESCAPE) 按下回退键Esc
send_keys(Keys.BACK_SPACE) 按下删除键BackSpace
send_keys(Keys.SHIFT) 按下shift键
send_keys(Keys.CONTROL) 按下Ctrl键
send_keys(Keys.ARROW_DOWN) 按下鼠标光标向下按键
send_keys(Keys.CONTROL,'a') 组合键全选Ctrl+A
send_keys(Keys.CONTROL,'c') 组合键复制Ctrl+C
send_keys(Keys.CONTROL,'x') 组合键剪切Ctrl+X
send_keys(Keys.CONTROL,'v') 组合键粘贴Ctrl+V

百度经验: python实战006:find_element_by_xpath定位元素

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

`get_by_css_xpath` 并不是标准的函数名,但根据你的描述,可能是你希望结合 CSS 选择器和 XPath定位元素。在实际开发中,我们通常使用 Selenium 或其他工具来通过 CSS 选择器或 XPath 定位网页中的元素。 以下是分别通过 **CSS 选择器** 和 **XPath** 定位元素的示例代码: ### 使用 Selenium 通过 CSS 选择器定位元素 ```python from selenium import webdriver # 初始化 WebDriver(以 Chrome 为例) driver = webdriver.Chrome() # 打开目标网页 driver.get("https://example.com") # 使用 CSS 选择器定位元素 element = driver.find_element_by_css_selector("div.class_name") # 输出元素的文本内容 print(element.text) # 关闭浏览器 driver.quit() ``` ### 使用 Selenium 通过 XPath 定位元素 ```python from selenium import webdriver # 初始化 WebDriver(以 Chrome 为例) driver = webdriver.Chrome() # 打开目标网页 driver.get("https://example.com") # 使用 XPath 定位元素 element = driver.find_element_by_xpath("//div[@class='class_name']") # 输出元素的文本内容 print(element.text) # 关闭浏览器 driver.quit() ``` --- ### 解释代码: 1. **CSS 选择器定位:** - `find_element_by_css_selector` 方法通过 CSS 选择器语法定位元素。 - 例如:`"div.class_name"` 表示选择所有类名为 `class_name` 的 `<div>` 元素。 2. **XPath 定位:** - `find_element_by_xpath` 方法通过 XPath 表达式定位元素。 - 例如:`//div[@class='class_name']` 表示选择所有类名为 `class_name` 的 `<div>` 元素。 3. **WebDriver:** - SeleniumWebDriver 是一个用于自动化浏览器操作的工具,可以模拟用户行为(如点击、输入等)。 --- ### 如果需要同时结合 CSS 和 XPath: 虽然 Selenium 不支持直接通过 `get_by_css_xpath` 同时使用 CSS 和 XPath,但你可以先用一种方式定位元素,再用另一种方式定位元素。例如: ```python from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") # 先用 CSS 选择器定位元素 parent_element = driver.find_element_by_css_selector("div.parent_class") # 再用 XPath 定位元素 child_element = parent_element.find_element_by_xpath(".//span[@id='child_id']") print(child_element.text) driver.quit() ``` 上述代码中: - 先通过 CSS 选择器找到父元素。 - 然后在父元素范围内使用 XPath 定位元素。 --- ### 注意事项: 1. **CSS 选择器和 XPath 的区别:** - CSS 选择器更简洁,适合简单的 DOM 结构。 - XPath 更强大,支持复杂的路径表达式,但性能稍逊。 2. **Selenium 版本问题:** - 在 Selenium 4 中,`find_element_by_*` 方法已被弃用,推荐使用 `find_element` 配合 `By` 类: ```python from selenium.webdriver.common.by import By element = driver.find_element(By.CSS_SELECTOR, "div.class_name") ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ProgramNotes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值