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页面的功能进行自动化测试的目的. 其一 ...
随机推荐
- 记node,elementui,formidable上传图片
卡了很久甚至心态爆炸,搞了半天才能成功上传图片,结果图片上传的位置也有问题.头大 https://www.jianshu.com/p/3a61318c24d1 先是参考这个来弄好大致的部署. 然后中途 ...
- pdb 进行调试
import pdb a = 'aaa' pdb.set_trace( ) b = 'bbb' c = 'ccc' final = a+b+c print(final) import pdb a = ...
- HTML <hr> 标签
高佣联盟 www.cgewang.com HTML <hr> 标签 实例 当内容的主题发生变化时,使用 <hr> 标签进行分隔: <h1>HTML</h1&g ...
- PHP debug_zval_dump() 函数
debug_zval_dump 函数用于查看一个变量在zend引擎中的引用计数.类型信息. 版本要求:PHP 4 >= 4.2.0, PHP 5, PHP 7高佣联盟 www.cgewang.c ...
- 7.6 NOI模拟赛 灯 根号分治
比较容易想的题目~ 容易发现 点亮一种颜色的贡献=新增灯的数量-已经存在的边的条数. 用线段树维护并不容易.暴力的话复杂度是\(Q\cdot n\)的. 考虑根号分治 只单纯考虑度数<B的点的话 ...
- CF R638 div2 F Phoenix and Memory 贪心 线段树 构造 Hall定理
LINK:Phoenix and Memory 这场比赛标题好评 都是以凤凰这个单词开头的 有凤来仪吧. 其实和Hall定理关系不大. 不过这个定理有的时候会由于 先简述一下. 对于一张二分图 左边集 ...
- SSRS - 请求因 HTTP 状态 401 失败: Unauthorized。
原因: 1.SSRS报表服务器停止了,重启就可以了 2.用户没有权限 3.用户登录密码过期了,重设密码就可以了(如果用户是安装了client的话,直接让他远程登录改一下密码)
- SpringCloud系列之客户端负载均衡Netflix Ribbon
1. 什么是负载均衡? 负载均衡是一种基础的网络服务,它的核心原理是按照指定的负载均衡算法,将请求分配到后端服务集群上,从而为系统提供并行处理和高可用的能力.提到负载均衡,你可能想到nginx.对于负 ...
- [转]new一个对象的过程中发生了什么?
来自:沉默哥 | 公号 :程序员小乐 链接:cnblogs.com/JackPn/p/9386182.html Java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就 ...
- centos,linux环境下安装JDK1.8完整
进入oracle官网下载安装包,cetos一般选择xx-xx-linux-x64.tar.gz.获取到地址后可以点击下载,也可以使用wget命令下载. 在得到下载好的文件后下面就可以开始安装了.比如我 ...