Web自动化必会知识:「Web基础、元素定位、元素操作、Selenium运行原理、项目实战+框架」
1.web 基础-html、dom 对象、js 基本语法
Dom 对象里面涉及元素定位以及对元素的修改。因为对元素操作当中涉及的一些 js 操作,js 基本语法要会用。得要掌握前端的基本用法。为什么要元素定位?因为找到这个元素,就能告诉代码要找谁要做什么。
2.元素定位
四大基本元素定位:id name class_name tag_name
针对链接:link_text
部分文本内容:partial_link_text
万能定位方式:xpath css
常用的元素定位方式是:id xpath
css 选择器的定位方式看起来比较复杂,和前端挂钩,但是 css 能做的事,xpath 一样能做。只要能解决问题就行。
动态 id,可以用别的属性来定位。xpath 基本的定位原则是:相对路径,相对路径中基本的定位方式是//标签名[@属性名=值]
但是这种基本定位方式对我们来说不够用,所以增加了逻辑运算://标签名[@属性名=值 and/or@属性名=值 ]
以上是靠自身的属性来定位,还可以靠文本内容来定位:通过文本匹配的方式,「目前 css 是不支持文本定位方式的。」 但是 xpath 可以定位:文本全匹配://标签名[text()=文本值]
文本和属性的部分匹配://标签名[contains(text()/@属性值,部分值)]
以上 3 种是根据自己的特质来匹配的。
如果靠自己的特质不行的话,可以通过:
1.层级定位:先定位到上级或者上上级,缩小范围,再定位元素。
2.轴定位:找各种关系来定位。这种一般在表格当中比较多。轴定位的方式有这几种:
ancestor:祖先
parent:父母(这里主要指爸爸)
兄弟姐妹:
preceding-sibling
:选取当前节点之前的所有同级节点,同一个parent下该节点之前的节点,即“哥哥”节点(是同父的哥哥节点)。
following-sibling
:选取当前节点之后的所有同级节点。
在各种定位解决不了问题的情况下就可以用轴定位了。各种定位方式随便组合,就能够定位到你要的东西。
「定位原则:」
定位也非常影响脚本的稳定性,如果定位做的不好,这个影响也是比较大的。
1.尽量不要使用绝对路径和下标。
2.通过定位方式唯一匹配元素,匹配一个元素,而且确保这个元素就是你要找的。
3.选择元素稳定的属性。(这样不至于元素一变动或者页面的内容一变动,这个元素对应的东西也变了。可变的属性不要作为元素定位手段)这个需要自己观察了。
3.元素操作
「页面最基本的 4 大操作(函数):」
send_keys
:输入
click
:点击
text
:获取文本值
get_attribute
:获取属性
在 APP 的 web 自动化中直接套用这 4 大操作。
针对特殊的元素做的一些处理:
「三种等待方式:」
sleep
:强制等待
implicity_wait
:隐形等待
WebdriverWait和expected_condition
:显示等待
在实际工作过程当中,sleep
会和WebdriverWait和expected_condition
结合起来用。
sleep
仅仅作为辅助作用,WebdriverWait
和条件组合起来能够找到元素,但是在运行的时候会告诉我,这个元素还没有出现,这种情况下不用觉得它没有用。「再借助sleep
0.5 秒或者 1 秒都可以。」 给页面一个缓冲的时间,虽然它可能找到了,但是可能页面渲染还没有成功。
sleep
不应该睡眠太久,这样很浪费时间。WebdriverWait
这个显性等待是我们用的最多的。WebdriverWait
是一个类,它处理的是我们的等待。它有一个等待上限。
「显性等待的用法:」
WebdriverWait(driver,timeout,0.5 ).until/until_not
会话对象 超时时长(最多能等多久,隔多久看一眼) 默认是 0.5,可以改成别的数字
WebdriverWait
有 2 个函数until/until_not
,一个是直到条件满足,一个是直到条件不满足。
「怎么表达条件?」
条件就用expected_condition 期望的条件
。可以用它来作为条件表达,条件表达最常用的就是元素可见。关于它的传参,是一个元组等等。visibility_of_element_located((元素定位类型,元素定位表达式))
还有元素存在,元素可点击等等。
「三种切换:」
三种切换都用到了等待。
iframe切换、window切换、alert弹框
都有一个显性等待。
iframe切换
是一定要有iframe
才需要切换。一定要确保你的元素确实是在iframe
里面。至于如何确认的,请回看文章《三种切换》。
iframe
本质上也是一个元素,只不过它的标签名叫做iframe
。但是它里面放的是个 web 页面。
APP 自动化中就有这样的情况,外面是一个安卓的控件元素,但是控件里面放的是 web 网页。这里也是一样的意思。iframe
是外面的主页的一个元素控件。跟它里面放的是一个 html 页面含义是一样的。
在 App 自动化中 h5 的混合应用,也就是 web 网页和安卓原生控件混在一个页面中的时候,也要涉及切换,道理和iframe
一样的。结合了iframe
和windows
。
「iframe切换可以根据哪些属性?」
name 下标 表达式 WebElement对象
以上这些都可以切换进去的。切换是这样做的:在我们 selenium Webdriver
当中切换是统一的driver.switch_to.frame/window/alert
。
APP 自动化中也是driver.switch_to
。这个东西是通用的,只是后面跟的名字不一样。
「windows 的处理流程是:」
要获取当前所有的window_handle(driver.window_handle)
得到的是一个列表。最后一个是最新打开的窗口。是根据它的句柄,也就是根据列表当中的位置去切换的。自己要清楚它在哪个位置。
「alert
弹框」
只有处理了alert
才能对页面进行操作。一个浏览器当前直接只能有一个alert
。它是一个alert
类来处理的。alert
当中有accetp\dissmis
来表示接收和拒绝。
「鼠标/键盘操作」
鼠标:ActionChains类:
这个类里面分为 2 种操作类型:
将所有的操作双击、点击、拖拽、右键这样的东西都是放在一个列表当中。
1.鼠标行为函数(move_to_element、悬浮元素的定位)。
2.perform()函数是用来执行鼠标操作的。
能不用鼠标就不用鼠标,如果有其它的按键操作就代替鼠标操作,因为鼠标操作不稳定。
APP 自动化中有一个东西的套路和ActionChains
的套路是一样的。Web 自动化的基本东西和框架掌握了,那么 APP 自动化就没有什么难度。
「键盘操作」:send_keys(Keys)
send_keys(Keys类)
本来就是用来发送数据的。1,2,3...等这样的简单数字就用send_keys()
发就可以。
没必要用到 Keys 类。当你用到组合键的时候,就可以用 Keys 类。其它情况下,没事不用它。
「下拉列表:」
Select\option
-Select
类来处理。
Select
类来处理,有哪 3 种选择的方式?实例化的时候传什么样的对象?
实例化类的时候,初始化参数是Select
元素。
「列表选值的 3 种方式:」
index/value/visible_text
value
是value
属性。index
是它在这个列表中所处的位置,从 0 开始。visible_text
是指它的文本内容。
有哪个用哪个,如果value/visible_text
没有,那么index
是肯定可以用的。根据实际情况而定。
以上这些是特别的处理,其它的下拉列表,例如通过 div 实现的,等到下拉列表出现再去处理。像这种是不需要等到下拉列表出现的,直接省了这个步骤,也不需要你去点一下让它出现。
「js-滚动条:」
APP 其实也有滚动条的,但是做法有点点区别。滚动条是执行 js 语句。driver.execute_script(js语句,参数)
这个参数可以传很多个。这个参数是给 js 语句用的。
Arguments[0]scrollintoView()
传参 滚动到可见区域
默认是 True,与上边对齐。改成 False,是与下边对齐。
Arguments[0]
0 来自于这个driver.execute_script(js语句,参数)
执行语句中的参数,是第一个参数。如果是第二个,就是Arguments[1]
。
「由参数的个数决定Arguments
里面的下标值到底是几。」
至于滚动到页面底部和滚动到页面顶部,用scrollintoView()
。
另外一个 js 中的语法也可以做这个事情:scrollintoViewifneeded()
并不是一定要处理滚动条,看系统。如果框架实现了截图,截图里也看不到,元素是可见的但是提示你不可见,那就需要你将它滚动到可见区域。很多情况下是不需要将它滚动到可见区域的。
「js-日期:」
如果不好做这块的自动化就不要做了,就手点了。
日期输入框readonly
属性。
也有可以编辑的时候,如果可以编辑就按照系统规定的格式输入。如果是不可以输入的,移除readonly
属性,或者将它设置为 False。
「文件上传:」
autoit
需要学习成本。在 mac 或者 linux 下面,用autoit
。
pywin32
:专门针对 windows 做的文件上传。这块的代码在《利用 pywin32 库上传文件》一文里,你们直接拷贝就可以,不需要自己再写一遍了,明白你需要改的地方是什么就可以了,有需要的自取。
4.Selenium 运行原理
以命令的形式定义好了内部 http 通信协议。所有的命令都定义好了,所有的函数基本操作都是通过发送命令来实现的。详情请回看《元素定位和元素定位辅助工具》一文。
对原理有进一步的认知是比较好的。要成为一个会研究的人而不是只会用的人,所以多看源码。
5.项目实战+框架
1.业务了解,需求了解。(如果公司让你写一份自动化测试计划,这个就是整个自动化测试计划的一部分。前期就是要花时间了解业务的。)详细的请回看《做自动化之前的准备工作》一文。
2.测试用例的实现、筛选(多和团队人员交流,了解全方位的信息)、用例评审。
3.框架、大概用多少时间实现自动化测试用例、持续集成jenkins、优化和调试、提高用例通过率(通过率至少80%)、哪些是冒烟用例(什么时候/运行时长)、SIT/预生产、邮件通知。
4.维护阶段(分析测试报告--哪些是bug、哪些是你代码的bug、哪些是环境问题)
5.汇报。
在前期就应该明白哪些是冒烟用例,实现用例可能两个月,后期的调试需要半个月,调试是需要时间的,也不简单。什么时候冒烟,什么时候回归,每周运行多少次,周末要不要运行等这些运行策略,在最开始做的时候自己就要非常清楚的。
「框架:」
PO 模式:PageObjects(页面操作、元素定位)、TestCase(业务流程)、测试用例和测试对象分离。
进一步分层:PageLocators(页面元素定位)、TestDatas(测试数据的分离)
Common
:basepage
:封装基本函数、异常处理、失败截图、日志。
Outputs
:Logs、Screenshots、Reports
pytest
框架:mark、参数化、fixture/conftest.py、重运行(reruns)、html测试报告、allure测试报告、xml测试报告(定制化)
pytest 的 html 测试报告当中是可以插入自动化截图的,既然用了 Allure 就不需要这个功能了。
6.问题整理
Jenkins 中可以关联工程的执行顺序的。可以设置当前工程执行成功之后再去执行下一个工程。
「pytest 里面有个 skip 是什么?」
unittest
也有 skip
。是指这个用例不想执行的话就跳过去。
「执行机和本机不能是同一台电脑。」
ps:假如领导让处理你不熟悉的领域的事,不要犹豫,赶紧去做。有什么不懂得可以多和上司沟通,自己不需要做决策,可以提供方案让领导来选择。遇事不退缩,勇敢面对。
公众号 「「清菡软件测试」首发,更多原创文章:清菡软件测试 78+原创文章,欢迎关注、交流,禁止第三方擅自转载。
Web自动化必会知识:「Web基础、元素定位、元素操作、Selenium运行原理、项目实战+框架」的更多相关文章
- web自动化01-自动化解决的问题-环境搭建-元素定位
自动化测试 概念:由程序代码代替人工完成验证系统功能的过程 解决的问题: 回归测试 压力测试 兼容性测试 提高测试效率,提升产品质量 自动化测试分类 web自动化测试 移动自动化测试 接口自动化测试 ...
- CSS 基础:定位元素(3)<思维导图>
这段时间利用一下间隙时间学习了CSS的基础知识,主要目的是加深对CSS的理解,虽然个人主要工作基本都是后台开发,但是个人觉得系统学习一下CSS的基础还是很有必要的.下面我学习CSS时做的思维导图(全屏 ...
- web自动化之前端知识
下面这种写法只作用于这1个标签: 下面这种也是比较老的写法: 下面是常用的方式:把一个css样式放入到一个文件中,然后引用: 第三方引用的css一般是压缩过的,这样静态资源加载速度会比较快. 如 ...
- Java基础知识强化之多线程笔记05:Java程序运行原理 和 JVM的启动是多线程的吗
1. Java程序运行原理: Java 命令会启动Java 虚拟机,启动 JVM,等于启动了一个应用程序,也就是启动了一个进程.该进程会自动启动一个 “主线程” ,然后主线程去调用某个类的 m ...
- selenium知识思维导图|从元素定位到操作断言,助你快速入门自动化测试
为什么要进行自动化测试? 缩短测试周期,节省成本. 避免人为出错,提高准确性和可靠性. 获取需求覆盖率,代码覆盖率,提供衡量软件质量的指标. 自动化测试的条件? 手工测试完成后. 项目周期长,需求稳定 ...
- 0基础手把手教你搭建webpack运行打包项目(未完待续)
这些天在项目之余的时间学习了webpack打包项目的东西,非常荣幸的找到一些大神的文章来学习,死劲嚼了几天,终于略知一二.在以后的工作上还需继续学习,下面我将分享我这几天学到的一点东西,希望能让我一个 ...
- 零基础 Vue 开发环境搭建 打开运行Vue项目
[相关推荐]IntellIJ IDEA 配置 Vue 支持 打开Vue项目 所需文件 node.js环境(npm包管理器)(node-v8.11.3-x64.msi)(npmV5.6.0) cnpm ...
- Helium文档6-WebUI自动化-S用于通过id\name\classname\xpth定位元素
前言 S方法可以灵活定位元素特别注意,比如to_left_of参数的使用是查找在某个元素左侧的元素,但是默认只会找第一个S方法可以灵活运用,特别是没有id,没有name,只有classname的情况, ...
- Web自动化框架LazyUI使用手册(1)--框架简介
作者:cryanimal QQ:164166060 web端自动化简介 web端自动化,即通过自动化的方式,对Web页面施行一系列的仿鼠标键盘操作,以达到对Web页面的功能进行自动化测试的目的. 其一 ...
随机推荐
- WSGI应用程序示例
import time # WSGI允许开发者自由搭配web框架和web服务器 def app(environ,start_response): status = '200 OK' response_ ...
- shell动态向sql传参
一直在想有什么好方法可以实现,用shell动态给sql传参,自己写了一个简单,有什么好方法,欢迎留言补充,下面代码纯手打,可能有疏忽之处,请大佬批评指正指正. 实现方法如下: 1.新建一个文件02.t ...
- 第七章 vuex专题
一.Vuex安装 一般在创建项目是会选择 Vuex,如果没有选择: cnpm install vuex --save 使用: import Vuex from "vuex"; V ...
- PHP array_slice() 函数
实例 从数组的第二个元素开始取出,并返回直到数组末端的所有元素: <?php$a=array("red","green","blue" ...
- PDO::lastInsertId
PDO::lastInsertId — 返回最后插入行的ID或序列值(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0) 说明 语法 string PDO::lastIn ...
- Metal 线宽如何选择
https://www.cnblogs.com/yeungchie/ Metal 线宽如何选择 假如Metal是为了传输电流,则主要需要从解决和减小它的寄生电阻.寄生电容方面多做考虑.寄生电感一般忽略 ...
- Maven知识记录(一)初识Maven私服
Maven知识记录(一)初识Maven私服 什么是maven私服 私服即私有的仓库.maven把存放文件的地方叫做仓库,我们可以理解成我门家中的储物间.而maven把存放文件的具体位置叫做坐标.我们项 ...
- 【JSOI2007】文本生成器 题解(AC自动机+动态规划)
题目链接 题目大意:给定$n$个子串,要求构造一个长度为$m$的母串使得至少有一个子串是其子串.问方案数. ------------------------ 我们可以对要求进行转化:求出不合法的方案数 ...
- Android 进度条(ProgressBar)和拖动条(Seekbar)补充“自定义组件”(总结)
这周结束了,我也码了一周的字,感觉还是很有种脚踏实地的感觉的,有时间就可以看看自己的总结再查漏补缺,一步一个脚印,做出自己最理想的项目. 今天我们讲两点: 1.ProgressBar: 其实前面也稍微 ...
- Flink的状态编程和容错机制(四)
一.状态编程 Flink 内置的很多算子,数据源 source,数据存储 sink 都是有状态的,流中的数据都是 buffer records,会保存一定的元素或者元数据.例如 : ProcessWi ...