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
:选取当前节点之后的所有同级节点。
在各种定位解决不了问题的情况下就可以用轴定位了。各种定位方式随便组合,就能够定位到你要的东西。
定位原则:
定位也非常影响脚本的稳定性,如果定位做的不好,这个影响也是比较大的。
代码语言:txt复制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
当中有accetpdissmis
来表示接收和拒绝。
鼠标/键盘操作
鼠标:ActionChains类:
这个类里面分为 2 种操作类型:
将所有的操作双击、点击、拖拽、右键这样的东西都是放在一个列表当中。
代码语言:txt复制1.鼠标行为函数(move_to_element、悬浮元素的定位)。
2.perform()函数是用来执行鼠标操作的。
能不用鼠标就不用鼠标,如果有其它的按键操作就代替鼠标操作,因为鼠标操作不稳定。
APP 自动化中有一个东西的套路和ActionChains
的套路是一样的。Web 自动化的基本东西和框架掌握了,那么 APP 自动化就没有什么难度。
键盘操作:send_keys(Keys)
send_keys(Keys类)
本来就是用来发送数据的。1,2,3...等这样的简单数字就用send_keys()
发就可以。
没必要用到 Keys 类。当你用到组合键的时候,就可以用 Keys 类。其它情况下,没事不用它。
下拉列表:
Selectoption
-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.项目实战 框架
代码语言:txt复制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 原创文章,欢迎关注、交流,禁止第三方擅自转载。