Python+Selenium4元素定位_web自动化(3)

news2024/11/14 11:06:43

目录

0. 上节回顾

1. 八大定位

2. 定位器

3. CSS选择器

4. XPath选择器

4.1. XPath语法

4.2. XPath 函数

5. 相对定位

5.1 XPath 中的相对定位【重点】

5.1.1 相对路径

5.1.2 轴

5.2 selenium4 中的相对定位

总结

0. 上节回顾

  • 浏览器的一般操作
  • 浏览器的高级操作:窗口切换
  • 启动参数:最大化、无头模式、设置代理,通过options参数进行传递

driver = webdriver.Chrome()  # 启动浏览器 是空白页
driver.get("http://118.24.147.95:8086/iframe_1.html")
# 刚打开网页

h2 = driver.find_element(By.TAG_NAME, "h2")
print("a", h2.tag_name, h2.text)

iframe = driver.find_element(By.XPATH, '//*[@id="you_frame"]')
driver.switch_to.frame(iframe) # 完成一次iframe的切换
h2 = driver.find_element(By.TAG_NAME, "h2")
print("右侧b", h2.tag_name, h2.text)

iframe = driver.find_element(By.XPATH, '//*[@id="my_frame"]')
driver.switch_to.frame(iframe) # 又完成一次iframe的切换
h2 = driver.find_element(By.TAG_NAME, "h2")
print("右侧c", h2.tag_name, h2.text)
# driver.switch_to.parent_frame() # 返回上一次层iframe
# driver.switch_to.default_content() # 返回顶层frame
# h2 = driver.find_element(By.TAG_NAME, "h2")
print("d", h2.tag_name, h2.text)
driver.quit()
任何元素都是可以被定位到的,没有例外!

1. 八大定位

WebDriver 中提供 8 中不同的定位策略
<input id='search-input' name="wd" type="text" placeholder="其实搜索很简单^_^ !" value="" autocomplete="off">
<button type="submit" id="ai-topsearch" class="submit am-btn"> <i class="am-icon-search"></i> <span>搜索</span> </button>
  • ID : 根据元素的ID属性进行定位
  • NAME: 根据元素的NAME属性进行定位
  • TAG_NAME: 根据元素的标签名进行定位
  • CLASS_NAME:根据元素的class属性进行定位(不可使用复合类名 submit am-btn
driver = webdriver.Chrome()  # 启动浏览器 是空白页
driver.get("http://101.34.221.219:8010/")

#根据元素的ID属性进行定位
# ele = driver.find_element(By.ID, "search-input")
# print("定位到的元素", ele.tag_name, ele.text)
#根据元素的NAME属性进行定位
# ele = driver.find_element(By.NAME, "wd")
# print("定位到的元素", ele.tag_name, ele.text)
# 根据元素的标签名进行定位
# ele = driver.find_element(By.TAG_NAME, "input")
# print("定位到的元素", ele.tag_name, ele.text)

#ele = driver.find_element(By.CLASS_NAME, "submit am-btn") # 定位失败 不可使用复合类名
ele = driver.find_element(By.CLASS_NAME, "submit") # 定位成功
print("定位到的元素", ele.tag_name, ele.text)

driver.quit()
  • LINK TEXT : 根据标签TEXT,定位A标签  (精确匹配)
  • PARTIAL_LINK_TEXT : 根据标签 部分 TEXT,定位A标签 (模糊匹配)

ele = driver.find_element(By.LINK_TEXT, "首页") # 输入完整的TEXT,精确匹配 
print("定位到的元素", ele.tag_name, ele.text) 

ele = driver.find_element(By.PARTIAL_LINK_TEXT, "首") # 输入部分的TEXT, 模 糊匹配
print("定位到的元素", ele.tag_name, ele.text)
  • CSS_SELECTOR
ele = driver.find_element(By.CSS_SELECTOR,"#search-input")
print(ele.tag_name)

  • XPATH
思考:
1. 哪些定位策略不会被转为 CSS 选择器,会被直接使用?
  • CSS
  • XPATH
  • LINK TEXT : 只能定位A标签,局限性很大
  • PARTIAL_LINK_TEXT: 只能定位A标签,局限性很大
2. 在浏览器底层, CSS XPATH 有什么区别?

2. 定位器

  • find_element 返回单个元素
  • find_elements 返回多个元素, 通过列表返回的

3. CSS选择器

CSS 是前端开发工程师,必备的技能,也是浏览器必备的能力
扩展资料:
https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Selectors
https://www.w3school.com.cn/cssref/css_selectors.asp
测试工程师,至少掌握以下几种:
  • ID选择器

#ID

  • CLASS选择器

.class

  • 元素选择器

input

  • 属性选择器

input[id=search-input]

  • 通配选择器
  • 层次选择器

#goods-category > div > div > div > ul >li

调试工具:Chrome的开发者工具, 通过 $() 执行CSS选择器的表达式
#search-input
对于CSS选择器来说,定位步骤如下:
1. 在开发者工具中,选中元素
2. 右键 - 复制 - 复制 CSS 选择器
3. 在开发者工具 - 控制台,对表达式进行调优 (可选项)

  对于长的选择器 可以优化 如下:找其父节点进行选择

ele = driver.find_element(By.CSS_SELECTOR,
#"body > div.nav-search.white.am-hide-sm-only > div > div.search-bar > form"
                          ".search-bar > form")
print(ele.tag_name)

4. XPath选择器

XPATH "XML 路径查询语言 " , 是 W3C 标准: https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-4.0/ms256115(v=vs.100)
XPATH 优势:
  • 支持逻辑表达式
  • 内置函数
Chrome 开发者工具 - 控制台,使用 $x() 执行 XPath 表达式

4.1. XPath语法

层级表示
/html/body/div
  • / (开头) 根路径
  • / (中间)下一级

  • // 任一级

属性表示
  • @ 属性
    • id
    • name
    • class
    •  。。。。

位置表示
  • 1开始
  • 没有-1

元素表示
  • 直接写元素名
  • * 代表所有的元素

SQL 不需要手写
CSS 不需要手写
XPATH 不需要手写
对于 XPATH 选择器来说,定位步骤如下:
        1. 在开发者工具中,选中元素
        2. 右键 - 复制 - 复制 XPATH
        3. 在开发者工具 - 控制台,对表达式进行调优 (可选项)
ele = driver.find_element(By.XPATH,
'//*[@id="search-map"]/div/div/ul/li[2]/div[1]')

4.2. XPath 函数

所有的函数 : https://www.w3school.com.cn/xpath/xpath_functions.asp
常用的函数 :
  • text $x('//div[text()="iphoneX新品发布了"]')
  • contains
  • starts-with $x('//img[starts-with(@alt,"Meizu/魅族")]')
  • ends-with
  • last
driver = webdriver.Chrome()  # 启动浏览器 是空白页
driver.get("http://101.34.221.219:8010/")

ele0 = driver.find_element(By.XPATH,'//img[@alt="Meizu/魅族 MX4 Pro移动版 八核大屏智能手机 黑色 16G"]')
print(ele0.tag_name)
# // 任意曾经进行搜索
# img 搜索img 元素
# contains(@alt,"vivo X5MAX") alt属性中,包含了"Meizu/魅族"的元素
ele = driver.find_element(By.XPATH, '//img[contains(@alt,"Meizu/魅族")]')
print(ele.tag_name)
driver.quit()

5. 相对定位

5.1 XPath 中的相对定位【重点】

四字口诀:父子兄弟

5.1.1 相对路径

相对路径 代表相对于当前节点的 单个节点
./ 子元素 
../ 父元素

需求: 定位到商品名称 和金额

# 不使用相对定位
name = driver.find_element( 
By.XPATH, '//*[@id="floor2"]/div[2]/div[2]/div[6]/div/div/a' 
)
price = driver.find_element( 
By.XPATH, '//*[@id="floor2"]/div[2]/div[2]/div[6]/div/p' 
)
print(name.text, price.text)
# 使用了相对定位 
driver.get("http://101.34.221.219:8010/")
# 定位共同父元素
ele = driver.find_element(By.XPATH, '//* [@id="floor2"]/div[2]/div[2]/div[6]/div')
name = ele.find_element(By.XPATH, ".//a") # 使用相对定位
price = driver.find_element(By.XPATH, ".//p") # 使用相对定位
print(name.text, price.text)

5.1.2

轴定位 代表相对于当前节点的 N个节点

轴名称
结果
following
自身之前的所有元素
preceding
自身之后的所有元素
ancestor
所有先辈(父、祖父等)
ancestor-or-self
所有先辈(父、祖父等)以及自身
parent
父节点
preceding-sibling
所有兄节点
self
自身
following -sibling
所有弟节点
child
所有子元素
descendant-or-self
所有后代元素(子、孙等)以及当前节点本身
descendant
所有后代元素(子、孙等)

with get_webdriver() as driver: 
driver.get("http://101.34.221.219:8010/") 
name = driver.find_element( By.XPATH, '//*[@id="floor2"]/div[2]/div[2]/div[6]/div/div/a' )
price = name.find_element(By.XPATH, "ancestor::*[2]/p") 
# ancestor,所有的祖先,爸爸最近,爷爷第二。。。。。。 
# ::轴的语法 
# * 所有类型的祖先 
# [2] 距离第二近 
# /下一级 
# p 定位p元素 
print(name.text, price.text)

5.2 selenium4 中的相对定位

四字口诀:上下左右

工作中不要使用

相对定位器
作用
above
在指定元素上方进行搜索
below
在指定元素下方进行搜索
to_left_of
在指定元素左侧进行搜索
to_right_of
在指定元素右侧进行搜索
near
在指定元素附近( 50px )进行搜索

driver = webdriver.Chrome()  # 启动浏览器 是空白页
driver.get("http://101.34.221.219:8010/")
# 定位 内衣
ele = driver.find_element(By.XPATH, '//*[@id="floor2"]/div[2]/div[1]/div[1]/a[3]')
# 定位 ele 上方 a 标签
n_ele = driver.find_element(locate_with(By.TAG_NAME, "a").above(ele))
assert n_ele.text == "女装"
# 定位 ele 下方 a 标签
n_ele = driver.find_element(locate_with(By.TAG_NAME, "a").below(ele))
assert n_ele.text == "女鞋"
# 定位 ele 右边 a 标签
n_ele = driver.find_element(locate_with(By.TAG_NAME, "a").to_right_of(ele))
assert n_ele.text == "运动"
原理:通过 JS 代码,遍历附近所有元素的 rect( 坐标和大小 ), 然后进行元素筛选定位
优势: 根据元素实际展示效果进行定位,不关系具体层级
弊端:效率低下,准确的低、通用性差,很多时候无法按照预期进行工作

总结

  • selenium 的角度,定位有八种策略
  • 从浏览器的角度,定位有2种选择器
    • CSS选择器, 通用性好,执行效率高,是selenium 推荐的选择器
    • XPATH选择器,效率高,有很多的函数,用法灵活
  • 底层都是通过JS实现的
  • 相对定位:
    • XPath 相对定位:能用
    • selenium4 相对定位: 不能用
实际项目中,一般统一封装为 XPATH 选择器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141696.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【sciter】:JSX 组件实现数据持久化

# 原理 组件数据持久化指的是:重新加载组件后,能否将重新加载前组件所存在的数据,在重新加载后数据依旧保存在组件中。 组件数据持久化实现原理:将每次更新组件数据同步到 Storage 中。并且监听组件重新加载(刷新),在刷新前将 Storage 关闭(确保数据不丢失)。当加载…

idea中添加git使用时文件不同颜色,标签不同颜色,代码不同颜色代表的含义

文章目录文件的颜色标签的颜色合并代码时不同颜色区块的含义文件的颜色 绿色——已经加入控制暂未提交&#xff1b; 红色——未加入版本控制&#xff1b;自己建立新文件后就是红色的&#xff0c;出现红色的一定要Add到git中&#xff0c;不然不能上传到远程仓库 蓝色——加入&am…

关于markdown相关语法的学习

众所周知&#xff0c;一个好的项目需要搭配一个好的项目说明&#xff0c;就行吃饺子需要蘸醋一样&#xff0c;没有醋的饺子&#xff0c;你仅仅吃掉了他的肉体&#xff0c;而得不到他的灵魂。下面开始吃饺子&#xff0c;不对&#xff0c;是开始学习markdown文件的基础语法&#…

在采购管理过程中使用技术有什么好处?

采购过程不总是简单直接的&#xff0c;人工采购过程非常耗费人力和时间&#xff0c;并且涉及大量文书工作。另一方面&#xff0c;当你在采购过程中使用技术时&#xff0c;比如使用SRM采购管理系统&#xff0c;会节省很多时间&#xff0c;使整个过程变得更加简单和轻松。 在讨…

Homekit智能家居创意DIY之智能吸顶灯

买灯要看什么因素 好灯具的灯光可以说是家居的“魔术师”&#xff0c;除了实用的照明功能外&#xff0c;对细节的把控也非常到位。那么该如何选到一款各方面合适的灯呢&#xff1f; 照度 可以简单理解为清晰度&#xff0c;复杂点套公式来说照度光通量&#xff08;亮度&#…

【达梦8】vm 虚拟机centos 7 安装达梦8 数据库

目录准备下载安装包版本选择安装前准备【登录root用户】创建用户【登录root用户】设置限制资源配置【登录dmdba用户】上传iso文件挂载iso创建安装路径开始安装【登录dmdba用户】安装【登录dmdba用户】初始化实例初始化注意事项开始初始化启动数据库启动方式1 &#xff08;推荐&…

Linux oom机制

Linux oom机制前言1 内存回收2 OOM基本原理2.1 虚拟内存OOM2.2 物理内存OOM3 oom配置参数3.1 panic_on_oom3.2 oom_kill_allocating_task3.3 oom_dump_tasks4 安卓LMK简介5 总结前言 Linux oom是由于内存泄漏或者内存使用不合理而导致的问题。 在讲OOM之前&#xff0c;我们先…

数据库,计算机网络、操作系统刷题笔记25

数据库&#xff0c;计算机网络、操作系统刷题笔记25 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…

Java实现栈结构

目录 一、栈概述 二、模拟实现栈 1、入栈 2、出栈 3、取栈顶元素 三、栈的应用 1、逆序打印链表 2、括号匹配问题 3、逆波兰表达式求值 4、栈的压入、弹出序列 5、最小栈 一、栈概述 栈&#xff08;Stack&#xff09;也是数据结构的一种&#xff0c;属于线性数…

Usaco Training刷怪旅 第三层 第五题:Wormholes

美国人出的题真的难&#xff08;个人感觉&#xff09;&#xff0c;看起来还行&#xff0c;做起来就是另外一会儿事儿了 Farmer Johns hobby of conducting high-energy physics experiments on weekends has backfired, causing N wormholes (2 < N < 12, N even) to ma…

基于物体基元空间几何特征的移动激光雷达点云街道树提取与分割

paper题目&#xff1a;Street Tree Extraction and Segmentation from Mobile LiDAR Point Clouds Based on Spatial Geometric Features of Object Primitives Abstract 从移动光探测与测距(LiDAR)点云中提取行道树仍然面临挑战&#xff0c;如在复杂的城市环境中提取精度低、…

浅谈哨兵机制的原理

文章目录哨兵机制的基本流程监控:主观下线&#xff1a;客观下线&#xff1a;选主&#xff1a;筛选&#xff1a;打分&#xff1a;通知&#xff1a;哨兵机制的基本流程 哨兵其实就是一个运行在特殊模式下的 Redis 进程&#xff0c;主从库实例运行的同时&#xff0c;它也在运行。…

el-input中放入elbutton

如图&#xff0c;如何在element组建的el-input的后缀放一个可点击的按钮或者标签 <el-input><el-button style"padding-right:10px" slot"suffix" type"text" >选择</el-button></el-input>在el-input的官网介绍中&…

jina实现并发扩展的调研

基于之前对于clip-as-service的调研&#xff0c;我在官方文档中看到横向扩展页面中的副本相关内容&#xff0c;可以解决并发问题&#xff0c;于是动手验证了一番 参考链接 &#xff08;官方文档&#xff09;link 官方文档的描述 首先我整了一个服务端 如果需要开启副本&…

线段相交判断

一、问题描述已知两条线段P1P2和Q1Q2&#xff0c;判断P1P2和Q1Q2是否相交&#xff0c;若相交&#xff0c;求出交点。两条线段的位置关系可以分为三类&#xff1a;[1] 有重合部分;[2] 无重合部分但有交点;[3] 无交点。注意&#xff1a;这里讨论的是两条线段是否相交&#xff0c;…

典型相关分析(附SPSS操作)

典型相关分析&#xff1a;研究两组变量&#xff08;每个变量中都可能有多个指标&#xff09;之间相关关系的一种多元统计方法。他能够揭示出两组变量之间的内在联系。选能较为综合、全面的衡量所在组的内在规律。一组变量最简单的综合形式就是该组变量的线性组合。典型相关分析…

还在用破-解版Navicat?有款纯Web化SQL开发工具,免安装还免费

经常使用SQL工具的开发者对Navicat一定都不陌生。这款软件作为一款全球化的多数据库管理工具&#xff0c;这些年逐步得到全国各地SQLer&#xff08;SQL开发者&#xff09;的关注。 与其他很多外来的软件产品一样&#xff0c;由于价格原因&#xff0c;很多SQLer感觉不太适合适应…

Maven(通用结构,集合了测试、打包、发布功能为一体)

Maven基础&#xff1a; 作用&#xff1a; 1.提供一套标准化的项目结构&#xff08;用于例如idea导入到eclipse或其他软件中&#xff0c;项目结构不会紊乱&#xff09; 2.提供一套标准化构建流程&#xff08;编译、测试、打包、发布...&#xff09;&#xff08;右键Maven-run…

VS中的cmake

新建cmake项目要保证VS安装了SDK&#xff0c;这里是VS2019版本打开创建新项目——查找cmake——设置路径和项目名称新建项目下有三个文件&#xff1a;&#xff08;1&#xff09;与项目同名的cpp文件&#xff08;2&#xff09;与项目同名的h文件&#xff08;3&#xff09;cmake的…

Linux文件/文件夹权限详解

在Linux中&#xff0c;一个文件/文件夹的权限&#xff0c; 从文件/文件夹的归属来看&#xff0c;可以分为三类&#xff0c;一是文件/文件夹所有者权限、二是所有者所在的用户组权限、三是公共&#xff08;不限&#xff09;权限。 从文件本身的操作来看&#xff0c;也可以分为…