selenium 使用及定位

2023-11-07

使用find_element_by_*() 方法只需导入 from selenium import webdriver,使用 find_element() 方法除了导入 from selenium import webdriver ,还要导入 from selenium.webdriver.common.by import By。

Selenium4 提供了 8 种定位(单)节点的方法,如下表所示:

方法说明

find_element(By.ID) 通过 id 属性值定位节点

find_element(By.NAME) 通过 name 属性值定位节点

find_element(By.CLASS_NAME) 通过 class 属性值定位节点

find_element(By.TAG_NAME) 通过 tag 标签名定位节点

find_element(By.LINK_TEXT) 通过<a>标签内文本定位节点,即精准定位。

find_element(By.PARTIAL_LINK_TEXT)通过<a>标签内部分文本定位节点,即模糊定位。

find_element(By.XPATH) 通过 xpath 表达式定位节点

find_element(By.CSS_SELECTOR) 通过 css 选择器定位节点

find_element 找的是第一个符合条件的节点,

如果要查找所有符合条件的标签,需要用 find_elements,find_elements 的返回值是列表类型,可以用for循环遍历里面的节点。

一、定位

from selenium import webdriver
from selenium.webdriver.common.by import By

# 创建浏览器对象并访问网站
browser = webdriver.Chrome()
url = "https://www.baidu.com"
browser.get(url)

# 根据 id 定位
browser.find_element(By.ID,'su')

# 根据 name 定位
# 返回第一个元素
browser.find_element(By.CLASS_NAME,'fenlei')
# 返回所有元素
browser.find_elements(By.CLASS_NAME,'fenlei')

# 根据 class 定位
browser.find_element(By.NAME,'title-text c-font-medium c-color-t')
browser.find_elements(By.NAME,'title-text c-font-medium c-color-t')

# 根据标签名称定位
browser.find_element(By.TAG_NAME,'input')
browser.find_elements(By.TAG_NAME,'input')

# 使用链接文本定位超链接
browser.find_element(By.LINK_TEXT,'index')
browser.find_elements(By.LINK_TEXT,'index')
browser.find_element(By.PARTIAL_LINK_TEXT,'index')
browser.find_elements(By.PARTIAL_LINK_TEXT,'index')

# 使用 xpath 定位
browser.find_element(By.XPATH,'//input[@id="su"]')
browser.find_elements(By.XPATH,'//input[@id="su"]')

# 使用 CSS 选择器定位
browser.find_element(By.CSS_SELECTOR,'#su')
browser.find_elements(By.CSS_SELECTOR,'#su')

# 关闭浏览器
browser.close()

# 父找子
# 1.串联寻找
print driver.find_element_by_id('B').find_element_by_tag_name('div').text

# 2.xpath父子关系寻找
print driver.find_element_by_xpath("//div[@id='B']/div").text

# 3.css selector父子关系寻找
print driver.find_element_by_css_selector('div#B>div').text

# 4.css selector nth-child
print driver.find_element_by_css_selector('div#B div:nth-child(1)').text

# 5.css selector nth-of-type
print driver.find_element_by_css_selector('div#B div:nth-of-type(1)').text

# 6.xpath轴 child
print driver.find_element_by_xpath("//div[@id='B']/child::div").text
driver.quit()

# 子找父
# 1.xpath: `.`代表当前节点; '..'代表父节点
print driver.find_element_by_xpath("//div[@id='C']/../..").text

# 2.xpath轴 parent
print driver.find_element_by_xpath("//div[@id='C']/parent::*/parent::div").text

# 哥哥节点
# 1.xpath,通过父节点获取其哥哥节点
print driver.find_element_by_xpath("//div[@id='D']/../div[1]").text

# 2.xpath轴 preceding-sibling
print driver.find_element_by_xpath("//div[@id='D']/preceding-sibling::div[1]").text

# 弟弟节点
# 1.xpath,通过父节点获取其弟弟节点
print driver.find_element_by_xpath("//div[@id='D']/../div[3]").text

# 2.xpath轴 following-sibling
print driver.find_element_by_xpath("//div[@id='D']/following-sibling::div[1]").text

# 3.xpath轴 following
print driver.find_element_by_xpath("//div[@id='D']/following::*").text

# 4.css selector +
print driver.find_element_by_css_selector('div#D + div').text

# 5.css selector ~
print driver.find_element_by_css_selector('div#D ~ div').text

二、获取节点数据

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
url = "https://www.baidu.com"
browser.get(url)

# 定位节点
element = browser.find_element(By.ID,'su')

# 获取class的属性值
print(element.get_attribute('class'))
# 获取id的属性值
print(element.get_attribute('id'))
# 获取type的属性值
print(element.get_attribute('type'))
# 获取value的属性值
print(element.get_attribute('value'))

browser.close()
element1 = browser.find_element_by_link_text("地图")
# 获取节点的宽高
print(element1.size)

三、特殊节点处理(shadow dom)

此节点为动态加载的html标签,需要特殊处理(嵌入js语句切换到shadow dom节点里面获取相关数据,特别注意在shadow dom里面不可以使用xpath寻找元素,会报错显示找不到该元素)

def expand_shadow_element(element):
    shadow_root = self.driver.execute_script('return arguments[0].shadowRoot', element)
    return shadow_root


root1 = self.driver.find_element(By.XPATH, '/html/body/gradio-app')

shadow_root1 = expand_shadow_element(root1)
a = shadow_root1.find_element(By.ID, 'txt2img_prompt').find_element(By.TAG_NAME, 'textarea')
a.click()
a.clear()
a.send_keys(self.in_word if self.in_word else 'sea')

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

selenium 使用及定位 的相关文章

随机推荐

  • RMQ(区间最值查询问题)

    简介 RMQ Range Minimum Maximum Query 问题是指 对于长度为 n 的数列 A 回答若干询问 RMQ A i j i j n 返回数列A中下标在 i j 里的最小 大 值 也就是说 RMQ问题是指求区间最值的问题
  • 算力云服务器是干啥的,云服务器将成趋势计算力和安全性是考验

    云服务器是一种简单高效 安全可靠 处理能力可弹性伸缩的计算服务 通常来说 平台的每个集群节点被部署在互联网的骨干数据中心 可以独立提供计算 存储 在线备份 托管 带宽等互联网基础设施服务 关注的是高性能吞吐量计算能力 关注的是在一段时间内的
  • 多网卡的情况下收udp组播数据的坑

    多网卡的情况下收udp组播收不到 有可能是如下原因造成 https www cnblogs com xiaouisme p 12658554 html
  • 【设计】OOA、OOD、OOP

    这三者都是 OO Object Oriented 领域的思想 一般我们我们接到产品经理的需求后 开发阶段分这样几个步骤 可行性预研阶段 此阶段评估需求是否合理 能否实现 OOA阶段 此阶段分析用例 定义领域模型 OOD阶段 此阶段定义类图
  • Chat 插件上线,免注册即可使用~

    OpenAI 新上线的 Chat 可谓是火爆出圈 这个语言对话模型可以回答问题 承认错误 挑战不正确的前提 还能帮你修改代码中的 bug Chat 的应用场景很广泛 它可以用于处理多种类型的对话 包括对话机器人 问答机器人和客服机器人等 它
  • 几种常用时钟分频实现方法

    在我们学习中 常常需要对时钟进行分频处理 本文将介绍几种常用分频方法 一 2的整数次幂分频 这种分频很简单 只需要设置一个计数器 对计数器进行计数 计数器的第i位则对应的2的i 1次幂分频 此方法适用于占空比为1 2 如果占空比不为1 2
  • CentOS7安装Docker详细步骤

    查看此文章前强烈建议先看这篇文章 Java江湖路 专栏目录 前言 记录在CentOS7中安装docker的每一个步骤 1 Docker介绍 什么是docker 虚拟化容器技术 Docker基于镜像 可以秒级的启动各种容器 每一种容器都是一个
  • 使用cloudflare-pages托管网站

    欢迎关注 攻城狮Gala 公 众 号 每天一起学习 努力成为Web3全栈 如何白嫖省心的CloudFlare Pages服务 完美替代Github Pages 对大陆网络友好 背景 之前自己重新开始写博客了 为了方便本地md笔记 参考个人笔
  • [Orangepi 3 LTS]学习记录(一)

    本章内容基于官方手册 OrangePi 3 LTS H6 用户手册 v2 4 与自己实际操作撰写 准备香橙派开发板 闪迪TF卡 性能会更好一些 TF读卡器 USB转TTL模块 串口调试 HDMI 桌面登录 一 镜像安装 1 版本选择 下载对
  • WAF防火墙

    添加依赖 一下看情况而添加 不确定需不需要 apt get install gcc libpcre3 libpcre3 dev zlib1g dev tengine依赖 sudo apt get install openssl libssl
  • Nginx里的root/index/alias/proxy_pass的意思

    1 alias 别名配置 用于访问文件系统 在匹配到location配置的URL路径后 指向 alias 配置的路径 如 注意alias配置最后一定要有 而root可以没有 location test alias home sftp img
  • LEFT JOIN 和JOIN 多表连接

    转载 https blog csdn net mccand1234 article details 51734713 四张表contract customer customer3 customer4 这是比较熟悉的3张表的连接 SELECT
  • three.js全景视频

    小生最近学习three js 将three js官网提供的网站实例翻译翻译 共同学习 接下来翻译一下 webgl video panorama equirectangular html 运行结果https threejs org examp
  • Nacos实战(19)-Nacos健康检查机制:保障你的服务稳定运行!

    0 前言 注册中心不应仅提供服务注册和发现功能 还应保证对服务可用性监测 对不健康的服务和过期的进行标识或剔除 维护实例的生命周期 以保证客户端尽可能的查询到可用的服务列表 因此本文介绍Nacos注册中心的健康检查机制 1 注册中心的健康检
  • 在线代码编译运行工具

    在线代码编译运行工具 如果需要学习语言 比如练习一些算法 或者跑一些别人写的代码 有一些语言特性不太了解需要写一些简单的 demo 做一些验证 那么先搭建一个环境去跑就有一点麻烦了 无需搭建本地环境的代码在线运行工具就可以派上用场了 在线代
  • Mybatis 中$与#的区别

    1 是将传入的值当做字符串的形式 eg select id name age from student where id id 当前端把id值1 传入到后台的时候 就相当于 select id name age from student w
  • Linux环境里实现FLink项目的Zookeeper与Kafka启动

    1 配置FLink遇到的坑 启动 start cluster sh后提示Permission denied 用sudo会提示Please specify JAVA HOME Either in Flink config conf flink
  • C#串口SerialPort常用属性方法

    SerialPort 属性 BaudRate 获取或设置波特率 BytesToRead 得到 接收到数据的字节数 BytesToWrites 得到送往串口的字节数 DataBits 获取或设置数据位 IsOpen 获取一个值 判断串口是否打
  • SpringBoot结合Redis将Token存入缓存中进行登录

    将登录的Token存储在Redis中可以带来以下好处 提高安全性 将Token存储在Redis中 比将Token保存在本地Cookie或浏览器存储中更加安全 因为攻击者无法访问您的服务器上存储的Token 此外 由于Redis支持设置过期时
  • selenium 使用及定位

    使用find element by 方法只需导入 from selenium import webdriver 使用 find element 方法除了导入 from selenium import webdriver 还要导入 from