Web 自动化实战经验硬核总结

news2024/11/16 13:03:19

一、元素定位常用方法

1. xpath规则说明

"/" : 表示从根节点选取

"//" : 从匹配选择的当前节点选择

"@" : 选取属性

"*" : 匹配任何元素节点

"@*" : 匹配任何属性节点

1.1 属性使用说明

@placeholder

用法:"//input[@placeholder='请输入应用名称']"

@class

用法:"//button[@class='ant-btn ng-star-inserted']"

@id

用法:"//textarea[@id='description']"

@title

用法:"//li[@title='目录']"

@type

用法:"//input[@type='text']"

@name

用法:"//input[@name='wd']"

@value

按钮的文字是 submit;

用法://button[@value='submit']

PS: 注意是单引号!

1.2 函数使用说明

text()函数

"//ul//li[text()='2003年度']" '//a[contains(text(),"出")]' 

含义:文本部分匹配

last()函数

//input[last()]   

含义:定位最后一个

input标签 //input[last()-1]  

含义:倒数第二个input标签

not()函数

//input[not(@id)]  

含义:input标签中不包含id属性值

start-with()函数

"//input[start-with(@id,'开头')]"

ends-with()函数

"//input[ends-with(@id,'结尾')]"

contains()函数

"//input[contains(@id,'包含')]"

postion()函数

这里 position() 代表元素的位置,这种写法也是 xpath 中的一部分

//div[@id='food']/*[position()=2]

高级用法:

含义:表示最后1个元素

//div[@id='food']/*[position()=last()]

含义:表示倒数第3个元素

//div[@id='food']/*[position()=last()-2]

含义:表示最后3个元素

//div[@id='food']/*[position()>=last()-2]

position()索引函数使用:

可以这样写(以下是循环处理方式):

 
  1.  for i in range(1,13):

  2.       pos="//div[@class='month-container']/div[position()="+str(i)+"]//button"

2. CSS选择器(css selector)

作用:用于定位页面上的标签元素,找到符合选择器的标签元素,然后应用样式。

css定位语法

选择器表达示例含义
id选择器(id用 #表示)#abc匹配id为abc的标签
class选择器(class用 .表示).abc匹配class为abc的标签
标签选择器 p匹配p标签
分组选择器 a,span匹配a标签和span标签
属性选择器—指定值 [class=“li”]匹配class为li的标签

实例

html说明
[value="登录"]选择标签上有value="登录"属性的标签
[type="submit"]选择标签上有type="submit"属性的标签
属性选择器—不指定值 [title]匹配属性有title的标签
属性选择器—指定标签 a[title]匹配属性有title的a标签
属性选择器—匹配单词边界 a[title~=“hello”]匹配title包含hello的a标签

后代选择器(空格表示),可选取当前层级下的任意层级元素

例如:#ab p

含义:匹配id为ab的下一/多级p标签

实例

"f-workingset-selector > div:nth-child(2) p-treenode:nth-child(2) div[title='我的文件']"

nth-child(2)表示取div的第二个

子元素选择器(>),表示只能选择下一级的元素

例如:#ab>p

含义:匹配id为ab的下一级中的p标签

实例(f-data-copy-detail标签下一级连续查找):

"f-data-copy-detail > div > div.right-content > div > app-fone-splitter > app-fone-splitter-panel:nth-child(2) > div > div.from-tree > p-tree > div"

相邻兄弟选择器(+),表示只能选择同级的下一个元素

例如:#ab+.ab

含义:匹配id为ab的同级下一元素且该元素的class为ab才能匹配到

后续兄弟选择器(~表示),选取指定元素后的所有同级指定元素

例如:.ab~li

含义:匹配class为ab的标签后的所有同级li标签

css 伪类用法

表达式描述
nth-child(n)匹配第 n 个子元素
nth-last-child(n)匹配倒数第n个子元素
nth-of-type(n)匹配第 n 个指定类型的标签
first-child匹配第一个标签
last-child匹配最后一个标签

3. xpath 与 css 的对比

4. xpath 与 css 更详细示例对比

直接子元素

XPATH 中的直接子元素是使用“/”定义的,而在 CSS 上,它是使用“>”定义的

 
  1. XPATH://div/input

  2. CSS: div>input

后代元素

如果一个元素在另一个元素的内部(子元素或者孙元素),则它在 XPATH 中使用“//”定义,而在 CSS 中仅使用空格定义。

 
  1. XPATH://div//input

  2. CSS: div input

ID定位

XPATH 中的元素 id 使用以下内容定义:"[@id=‘kw’]",而在CSS中使用:"#kw"。

 
  1. XPATH://input[@id='kw']

  2. CSS: input#kw

CLASS定位

对于 class 属性,XPATH 类似 id,而 CSS 中用一个点表示。

 
  1. XPATH://input[@class="s_ipt"]

  2. CSS: input.s_ipt

弟弟元素:after-sibling 继兄弟

这对于表单元素非常有用,即页面中位于同一父节点内的下一个相邻元素

 
  1. XPATH://input[@class="s_ipt"]/after-sibling::a

  2. CSS:input[class="s_ipt"]+a

哥哥元素:berfore-sibling 前兄弟

页面中位于同一父节点内的上一个相邻元素

 
  1. XPATH://a[@name='tj_baike']/berfore-sibling::a

  2. CSS:无法实现

父节点元素

页面中位于一个节点的上级元素

 
  1. XPATH: //input/parent

  2. CSS: 无法实现

属性值

可以根据任何属性值定位元素

 
  1. XPATH: //input[@name='username']

  2. CSS: input[name='username']

多个属性值

可以通过多个属性来定位元素

 
  1. XPATH: //input[@name='rsv_spt' and @value="1"]

  2. CSS: input[name='login'][type='submit']

第一个子元素

 
  1. XPATH: //div[@id='u1']/a[1]

  2. CSS: div#u1 a:first-child

最后一个子元素

 
  1. XPATH: //div[@id='u1']/a[last()]

  2. CSS: div#u1 a:last-child

第二个子元素

 
  1. XPATH: //div[@id='u1']/a[2]

  2. CSS: div #u1 a:nth-child(2)

模糊匹配

selenium中允许使用 ^=,$= 或*=进行部分字符串匹配。^=匹配前缀

 
  1. XPATH: input[starts-with(@id,'user')]

  2. CSS: input[id^='user']

$=匹配后缀

 
  1. XPATH: input[ends-with(@id,'name')]

  2. CSS: input[id$='name']

*=匹配包含

 
  1. XPATH: input[contains(@id,'sernam')]

  2. CSS: input[id*=sernam]

二、selenium 常用事件说明

2.1 鼠标事件

名称含义
click(on_element=None)单击鼠标左键
click_and_hold(on_element=None)点击鼠标左键,不松开
context_click(on_element=None)点击鼠标右键
double_click(on_element=None)双击鼠标左键
drag_and_drop(source, target)拖拽到某个元素然后松开
drag_and_drop_by_offset(source, xoffset, yoffset)拖拽到某个坐标然后松开
key_down(value, element=None)按下某个键盘上的键
key_up(value, element=None)松开某个键
move_by_offset(xoffset, yoffset)鼠标从当前位置移动到某个坐标
move_to_element(to_element)鼠标移动到某个元素
move_to_element_with_offset(to_element, xoffset, yoffset)移动到距某个元素(左上角坐标)多少距离的位置
perform()执行链中的所有动作
release(on_element=None)在某个元素位置松开鼠标左键
send_keys(*keys_to_send)发送某个键到当前焦点的元素
send_keys_to_element(element, *keys_to_send)发送某个键到指定元素

2.2 键盘事件

selenium 常用键盘事件说明:

 
  1. #导入包

  2. from selenium.webdriver.common.keys import Keys

键盘操作

名称含义
send_keys(Keys.BACK_SPACE)删除键(BackSpace)
send_keys(Keys.SPACE)空格键(Space)
send_keys(Keys.TAB)制表键(Tab)
send_keys(Keys.ESCAPE)回退键(Esc)
send_keys(Keys.ENTER)回车键(Enter)
send_keys(Keys.CONTROL,‘a’)全选(Ctrl+A)

示例代码

 
  1. driver.find_element("id", "kw").send_keys(Keys.CONTROL, 'a')

  2. send_keys(Keys.CONTROL,‘c’) #复制(Ctrl+C)

  3. send_keys(Keys.CONTROL,‘x’) #剪切(Ctrl+X)

  4. send_keys(Keys.CONTROL,‘v’) #粘贴(Ctrl+V)

2.3 ActionChains模拟鼠标操作事件

 
  1. #导入包 

  2. from selenium.webdriver.common.action_chains import ActionChains

  3. #全选(Ctrl+A)

  4. send_keys(Keys.CONTROL,‘a’) 

链式执行示例代码:

 
  1. ActionChains(driver).key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).perform()

  2. #复制(Ctrl+C)

  3. send_keys(Keys.CONTROL,‘c’) 

链式执行示例代码:(指定了复制的区域)

 
  1. ActionChains(self.driver).key_down(Keys.SHIFT).click(ele_end).key_up(Keys.SHIFT).key_down(Keys.CONTROL).send_keys("c").key_up(Keys.CONTROL).perform()

  2. #剪切(Ctrl+X)

  3. send_keys(Keys.CONTROL,‘x’)

链式执行示例代码:

 
  1. ActionChains(self.driver).click(ele).key_down(Keys.CONTROL).send_keys("x").key_up(Keys.CONTROL).perform()

  2. #粘贴(Ctrl+V)

  3. send_keys(Keys.CONTROL,‘v’)

链式执行示例代码:

ActionChains(self.driver).click(ele).key_down(Keys.CONTROL).send_keys("v").key_up(Keys.CONTROL).perform()

 

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

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

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

相关文章

游戏录制没有声音怎么办?简单的解决方法分享

在享受游戏乐趣的同时,不少玩家也喜欢通过录制游戏视频来分享自己的精彩瞬间或是攻略心得。然而,有时在满心欢喜地开始录制后,却发现录制的视频竟然没有声音,这无疑是一大遗憾,今天我们就来看看这个问题怎么解决吧~ 游…

vue 中获取数值但是只获取到了 Promise 属性,获取不到其中的值

左边的请求能获取到数据,右边的不行? 改成这样即可

即插即用篇 | YOLOv8 引入单头视觉Transformer模块 | CVPR 2024

本改进已同步到YOLO-Magic框架! 最近,高效的视觉Transformer在资源受限的设备上以低延迟表现出了出色的性能。传统上,它们在宏观层面上采用44的Patch嵌入和四阶段结构,而在微观层面上使用多头配置的复杂注意力机制。本文旨在通过内存高效的方式解决各个设计层面的计算冗余问…

Python 从入门到实战28(文件的读操作)

我们的目标是:通过这一套资料学习下来,通过熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。 上篇文章我们讨论了文件的打开、创建、关闭的相关知识。今天我们将…

9_25_对话框

QColorDialog(调色板对话框) void MainWindow::on_pushButton_clicked() { // //创建一个调色板对话框 // QColorDialog* dialog new QColorDialog(this); // //设置调色板对话框的初始值,不调整默认是白色 // dialog->setCurrentColor(…

edu某智慧平台 ExpDownloadService.aspx接口任意文件读取漏洞复现 [附POC]

文章目录 edu某智慧平台 ExpDownloadService.aspx接口任意文件读取漏洞复现 [附POC]0x01 前言0x02 漏洞环境0x03 漏洞复现1.访问漏洞环境2.构造POC3.复现edu某智慧平台 ExpDownloadService.aspx接口任意文件读取漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技…

考虑电网交互及禁止运行区的风电、光伏与火电互补调度运行(MATLAB-Yalmip-Cplex全代码)

针对火电机组在某些区域存在禁止运行区(POR)的问题,若直接在yalmip中设置变量x约束:constraints = [Ppor_min<=x<=Ppor_max];,则造成的离散优化空间无法求解。 然而,我们可以借用yalmip越发完善的函数处理该约束。即在 YALMIP 中,implies 函数用于表示蕴含关系,…

记一次堆内存泄漏排查过程

记一次堆内存泄漏排查过程 前言定位问题 前言 写了一个升级脚本&#xff0c;执行过程中给内存干爆了&#xff0c;不作处理&#xff0c;自己又好了&#xff0c;神奇吗&#xff1f; 日志中内存溢出:java.lang.OutOfMemoryError: Java heap space 定位问题 top命令查看最耗CPU…

OceanBase云数据库战略实施两年,受零售、支付、制造行业青睐

2022年OceanBase推出云数据库产品OB Cloud,正式启动云数据库战略。两年来OB Cloud发展情况如何&#xff0c;9月26日&#xff0c;OceanBase公有云事业部总经理尹博学向记者作了介绍。 尹博学表示&#xff0c;OB Cloud推出两年以来&#xff0c;已服务超过700家客户&#xff0c;客…

遥感图像语义分割数据集制作(使用ArcGIS Pro)

0. 引言 图像分割就是把图像空间按照一定的要求分成一些“有意义”的区域的技术叫图像分割。一幅图像通常是由代表物体的图案与背景组成&#xff0c;简称物体与背景。若想从一幅图像中“提取”物体&#xff0c;可以设法用专门的方法标出属于该物体的点&#xff0c;如把物体上的…

鸿蒙界面开发(九):列表布局 (List)

列表布局 当列表项达到一定数量&#xff0c;内容超过屏幕大小时&#xff0c;可以自动提供滚动功能。它适合用于呈现同类数据类型或数据类型集&#xff0c;例如图片和文本。在列表中显示数据集合是许多应用程序中的常见要求&#xff08;如通讯录、音乐列表、购物清单等&#xf…

【动态规划-多重背包】【hard】力扣2585. 获得分数的方法数

考试中有 n 种类型的题目。给你一个整数 target 和一个下标从 0 开始的二维整数数组 types &#xff0c;其中 types[i] [counti, marksi] 表示第 i 种类型的题目有 counti 道&#xff0c;每道题目对应 marksi 分。 返回你在考试中恰好得到 target 分的方法数。由于答案可能很…

mac 上配置Jmeter代理进行web脚本录制过程容易踩坑的点

macOS 配置 Jmeter代理录制web脚本&容易踩坑的点 mac配置下载&#xff1a;前景提要&#xff1a;Jmeter中具体操作容易踩坑的点1、进入浏览器后&#xff0c;显示访问连接不安全。2、证书失效需要重新生成3、重新生成证书的方式4、没有生成新的证书5、jmeter安装路径找不到 m…

数据库实验2—1

10-1 查询重量在[40,65]之间的产品信息 本题目要求编写SQL语句&#xff0c; 检索出product表中所有符合40 < Weight < 65的记录。 提示&#xff1a;请使用SELECT语句作答。 表结构: CREATE TABLE product (Pid varchar(20), --商品编号PName varchar(50), --商品名称…

因为穷,研究了一些备考软考高级「系分」的省钱方法!

有大学生留言&#xff1a;老师推荐我们考软考高级-系统分析师&#xff08;简称“系分”&#xff09;&#xff0c;但是对于大学生来说每次考证都好贵啊&#xff01;报名费、各种备考资料、视频课程、官方教程......七七八八加起来不少钱了。有没有钱包不痛备考软考高级的方法&am…

springboot集成nacos+gateway+feign

一、创建项目 1.创建一个maven项目 2.添加对应的pom参数 2.1添加工程对应的jar包 <!-- 父工程 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.7</…

如何有效评估与最大化利用专利价值?

专利价值评估是确定专利经济价值的关键环节。对于企业而言&#xff0c;准确评估专利价值可以帮助其做出明智的决策&#xff0c;如是否进行专利的投资、许可、转让等。同时&#xff0c;专利价值评估也为金融机构提供了重要的参考依据&#xff0c;有助于推动专利质押融资、证券化…

GetThreadSelectorEntry teb peb 段选择子 LDT_ENTRY _LDT_ENTRY

GetThreadSelectorEntry 函数原型 BOOL GetThreadSelectorEntry([in] HANDLE hThread,[in] DWORD dwSelector,[out] LPLDT_ENTRY lpSelectorEntry ); typedef struct _LDT_ENTRY {WORD LimitLow;WORD BaseLow;union {struct {BYTE BaseMid;BYTE Flags1;BYTE Fla…

Chroma 向量数据入门

Chroma 是 AI 原生的开源矢量数据库。Chroma 使知识、事实和技能可插入 LLM&#xff0c;从而可以轻松构建 LLM 应用程序。Chroma 是 AI 原生的开源矢量数据库。Chroma 使知识、事实和技能可插入 LLM&#xff0c;从而可以轻松构建 LLM 应用程序。 &#x1f31f;Chroma是一个文档…

WIN2008 iis安装与ASP设置

win2008 IIS安装在 Windows Server 2008 系统中安装IIS - morgan363 - 博客园 如何在 Windows Server 2008 系统中安装 IIS 呢&#xff1f;且看如下分解&#xff1a; 1、鼠标右键 “计算机”&#xff0c;选择“管理”&#xff0c;打开“服务器管理器”。 2、在“服务器管理器”…