小屌丝:鱼哥,这金三银四的季节,你作为资深测试开发大佬(面试官),能不能分享一下关于UI自动化测试的技术呢?
小鱼:不用给我戴高帽,你的小心思,我能不知道?
小屌丝:嘿嘿,我主要提咱粉丝问的
小鱼:你操的心还怎不少呢?
小屌丝:主要是你分享的那篇《吊打面试官系列之:移动APP测试开发面试题汇总,对标P7职位~ ~熬夜整理,建议收藏!!!》太给力了。
小鱼:你可知道,移动测试app我准备了一周时间,
小屌丝:那就麻烦鱼哥再花一个星期,来准备 UI自动化测试开发相关的知识,也让更多的人,能感受吊打"面试官"快感。
小鱼:这…作为一名合格面试官,岂能是被随便吊打的,不过,你的提议确实不错,我考虑下。
小屌丝:据说印象城新开了一家烤鱼,味道不错…
小鱼:…
脚本启动driver;
driver去驱动浏览器作为远程服务器;
执行脚本发送请求;
服务器解析请求作出相应操作,并返回给客户端(脚本);
元素定位错误;
页面加载时间过慢,需要查找的元素程序已经完成,单页面还未加载,此时可以加载页面等待时间;
有可能元素包含在iframe或者frame里面,需要切换;
属性动态变化是指该element没有固定的属性值,只能通过相对位置定位。
第一种:用findelements遍历;
第二种:通过xpath的轴 parent / following-sibling / precent-sibling;
触发动态事件,继而findelement;如果是动态菜单,需要一级一级的find。
对input执行输入;
对富文本框的操作;
滚动到指定位置操作;
需要使用driver.switch_to.alert()
selenium本身是不可以处理windows弹窗的,但是可以借助AutoIT小工具来完成对windows弹窗的操作。比如 上传下载附件等
使用javascript将元素的border或者背景颜色改成黄色或其他颜色即可
不支持。selenium是根据网页元素的属性来确定范围元素的
没有,需要借助第三方工具。
不能
driver.get(‘url’) 或者 driver.navigate().to(‘url’)
NoSuchElementException 找不到页面元素异常;
ElementNoInteractac tableException;
selenium使用xpath定位时采用遍历页面的方式,性能指标较差。另外xpath定位有通过绝对路径定位的,有时会不准确;
而用css选择器定位比较简洁,运行速度更快,通常用于性能要求严格的场景。
法1:用try…except 在代码块加上;
法2:用elements定义组元素方法 然后根其元素个数len()<1 存在返回True, 不存在则返回False;
法3:结合WebDriverWait和excepted_conditions条件判断(强烈推荐);
显示等待,每间隔1秒判断一次,30秒超时,存在返回True,不存在则返回False
动态元素有两种情况:
一个是:属性动态,定位时,若id是动态的,就不要用id定位,用其他定位元素方法
另一个:还是这个元素一会在页面上方,一会在下方,飘忽不定,定位方法也是一样,根据元素属性定位(元素的tag name属性是不会变的,动的只是class属性和style属性)
通过父元素定位子元素,可以通过二次定位来找到。
第一种:通过子元素定位父元素,selenium提供了parent方法,但是只能定位到父元素,却不能获取元素属性,也不能操作。
第二种:通过xpath的语法直接定位。 如.//*[@name=“hello”]/… 两个点代表父级元素。
首选、截取当前页面并自定义保存;
其次、根据要截取元素图片的属性来获取该元素的坐标和大小 ele.location ele.size
第三、通过以下方式获取该元素的图片的坐标大小:
left = ele.location['x']
top = ele.location['y']
right = ele.location['x'] + ele.size['width']
bottom = ele.location['y'] + ele.size['height']
第四,再次打开刚开始保存的,通过image类中的crop方法(相当于拷贝该元素的一个矩形区域),然后做保存操作就可以了。
使用js点击,selenium有时候点击元素时会失效
# js 点击
js = 'document.getElementById('baidu').click()'
driver.execute_script(js)
首先只要页面一直没变过,说明定位方法是没问题的。
优化方向:
自己写相对路径,多用id为节点查找,少用右键复制xpath,那种不稳定。
第二个影响因素就是等待了,sleep等待尽量少用(影响执行时间)
定位元素方法重新封装,结合WebDriverWait和excepted_conditions判断元素方法,自己封装一套定位元素方法
减少不必要的操作;
页面加载过多并且不影响测试,可设置超时时间中断页面加载;
设置等待时间时,可以sleep()固定的时间,检测到元素出现后中断等待也可以提高速度;
配置testNG实现多线程,在编写测试用例时,一定要实现松耦合,在服务器允许的情况下尽量设置多线程运行,提高执行速度;
比如动态id 、有iframe的情况、没加等待等因素
隐藏元素可以正常定位到,只是不能操作(定位元素和操作元素是两码事,操作元素是指click 、clear 、send_keys等这些方法)。
我们可以用js来操作隐藏元素。
js和selenium不同,只有页面上有的元素(在dom里面的)都能正常操作。
send_keys和AutoIT工具实现
driver.get_screenshot_as_file('图片路径')
id:根据id来获取元素,返回单个元素,id值一般是唯一的;
name:根据元素的name属性定位;
tagName:根据元素的标签名定位;
className:根据元素的样式class值定位;
linkText:根据超链接的文本值定位;
partialLinkText:根据超链接的部分文本值定位;
cssSelector:css选择器定位;
xpath:通过元素的路径来定位;
强制等待:也叫线程等待, 通过线程休眠的方式完成的等待,如等待5秒: Thread sleep(5000),一般情况下不太使用强制等待,主要应用的场景在于不同系统交互的地方。
隐式等待:通过implicitly Wait完成的延时等待,注意这种是针对全局设置的等待,如设置超时时间为10秒,使用了implicitlyWait后,如果第一次没有找到元素,会在10秒之内不断循环去找元素,如果超过10秒还没有找到,则抛出异常,硬式等待比较智能,它可以通过全局配置,但是只能用于元素定位。
显式等待:也称为智能等待,针对指定元素定位指定等待时间,在指定时间范围内进行元素查找,找到元素则直接返回,如果在超时还没有找到元素,则抛出异常,显示等待是 selenium 当中比较灵活的一种等待方式,他的实现原理其实是通过 while 循环不停的尝试需要进行的操作。
driver.navigate().back(); //后退
driver.navigate().forward();//前进
driver.navigate().refresh();//刷新
如果是input元素的文件上传,可以通过 Selenium 当中的 send_keys 方式进行传递,但是这种方式局限性比较大,如果遇到像通过 js 调用的组件会有一些问题;
这个时候就需要通过一些和系统交互的方式去完成上传操作,比如通过autoit,pywinauto 或者是pyautogui这些第三方库进行操作。
UI自动化测试用例是从手工测试用例中提取出来的,跟手工测试用例相比,自动化测试用例更加注重用例的严谨性,选择用例的时候遵循以下原则:
优先选取覆盖产品核心功能的用例;
从成本考量,不要选择流程过于复杂的用例;
选取的用例可以是重复执行,繁琐的部分,比如字段验证、提示信息验证;
优先实现正向的测试用例,反向用例一般情况复杂、数量多;
PO模式,全称为Page Object Model ,简称POM,是页面对象模式。
对页面进行抽象或者说建模的过程,是把一个具体的页面转化为编程语言当中的一个对象,页面特性转化成对象属性,页面操作转化为对象方法。
把页面的一个个的web元素设计为页面对象的属性,把页面上的操作(如点击、输入等)设计为页面对象的行为。
在自动化测试当中,主要用来实现对页面操作和测试逻辑的一个分离,这样做的好处是业务和实现分开,使自动化测试脚本具备更高的可维护性。
公共方法表示页面提供的一个服务,比如我们可以把登录封装成一个 login 方法,把搜索方法封装成一个设施方法,把注册操作封装成一个 register 的方法;
尽量不要暴露页面的内部,比如一个HTML的页面还有一个页面的上下结构;
在 PO 当中一般不做断言,会做到页面逻辑和测试逻辑的分离;
PO 一般里面的方法返回 self 或者是其他的 Page Object ,也可以是一个元素属性;
整个 PO 不需要封装整个页面的行为,用到什么逻辑就封装什么;
对于统一操作,如果出现不同的结果,可以把用不同的方法来表示,比如说登录成功有跳转,登录失败有报错,如果登录还有一种会授权的状况,那么可以封装成三个单独的方法:login success、login error、login invalid。
尽量用相对路径的xpath表达式;
查找元素优先用显示等待;
用例与用例之间尽量避免产生依赖,用例可以独立执行;
用例执行结束后对测试场景进行还原,避免影响其他用例的执行;
脚本执行失败后加入重试机制,提升用例的稳定性;
尽量保证单独的测试环境,避免其他的测试同步进行;
Web端的自动化测试,基本就是模拟手工测试人员来做功能测试。
用机器的自动执行代替人的操作。
web端呈现的产品有两个方向可以做自动化测试:
且接口层自动化的比例要高于界面操作层。
主要对产品稳定的功能进行自动化测试,主要用于产品的核心功能冒烟测试、回归测试。从系统最核心的功能开始做,再根据情况慢慢展开。
可能是金三银四的原因,所以最近咨询我关于面试及测试开发技术的人也开始多起来了。
也因为《吊打面试官系列之:移动APP测试开发面试题汇总,对标P7职位~ ~》给的反馈不错,也有的大佬希望把其他及测试开发的技术也整理出来。
索性,就退出关于UI自动化方向的测试技术,
即《吊打面试官系列之:UI自动化面试题汇总,对标P7,从此再也不怕面试官了。》
希望更多的测试开发同学能掌握测试开发技术,同时,也不要在惧怕面试官,毕竟,太资深的测试开发面试官少之又少,遇到了,就好好向面试官请教,面试官也是人,不是不近人情的。
不是随随便便就去"虐"求职者
所以,归根结底,能让面试官友好的跟你"聊天",那就需要丰富自己的技术栈。
只有自己技术栈丰富了,才会得到面试官的"友好交流"。