AI考拉日常技术分享会,前有众多前后端以及android大神分享,这次测试老司机Eric也放招,手把手带devs入门UI自动化测试。话不多说,开课啦!
一、UI自动化框架的介绍
UI自动化包括哪些内容? UI自动化是通过工具或者脚本语言将测试过程模拟出来,并重复执行,用以验证功能是否正确的过程,包括:
- 界面层面(控件,元素,位置,显示等的识别)
- 功能交互层面(往往是通过代码或者测试框架来模拟真实用户的操作)
二、为什么要做UI自动化测试
- 敏捷开发的需要:满足产品敏捷开发、快速迭代的要求;
- 传统的手工测试重复度高,执行效率低;
- 迭代周期短,经常需要对原有功能进行回归测试。 一句话:提高测试效率,方便回归旧版本!
三、常见的框架有哪些
- Monkey:Android SDK自带的测试工具,发送伪随机事件(按键输入、触摸屏输入、手势输入等),无法自定义,主要用于压力测试;
- MonkeyRunner:Android SDK提供的测试工具,比monkey强大,支持编写脚本自定义事件;
- UiAutomator:Android提供的自动化测试框架,仅支持Java语言和Android平台,不支持WebView;
- Robotium:基于Google提供的Instrumentation的测试框架,仅支持Java语言和Android平台,不支持WebView;
- Appium:开源、跨平台的自动化测试工具,支持Java、python等多种语言,支持android和IOS,并且支持WebView; 给个框架对比图,感受下
综上,考拉团队选择了支持android以及ios版本、也支持WebView的Appium框架,自此打开了测试新大门。
四、Appium环境安装
- 安装Appium Server:需要先安装Node.js,然后再通过命令安装:npm install -g appium
- 安装Android SDK
- 安装Appium Client:通过pip命令安装。Windows下执行命令:pip install Appium-Python-Client
- 安装安卓模拟器:推荐下载安装GenyMotion;
- 自动化脚本demo (1)安装模拟器 (2)启动appium点击左上角“机器r人”按钮—点击右上角”三角“启动appium (3)通过python编写脚本
from appium import webdriver
desired_caps={}
desired_caps['platformName']='Android'
desired_caps['platformVersion']='4.3'
desired_caps['deviceName']='Android Emulator'
desired_caps['appPackage']='com.android.calendar'
desired_caps['appActivity']='.AllInOneActivity'
driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
...
driver.find_element_by_name("1").click()
driver.find_element_by_name("5").click()
driver.find_element_by_name("9").click()
driver.find_element_by_name("delete").click()
driver.find_element_by_name("9").click()
driver.find_element_by_name("5").click()
driver.find_element_by_name("+").click()
driver.find_element_by_name("6").click()
driver.find_element_by_name("=").click()
driver.quit()
五、Appium实践
- 启动App
- 元素定位
(1)通过id方式定位
element=driver.find_element_by_id("ID")
(2)通过name方式定位
element=driver.find_element_by_name("NAME")
(3)通过class方式定位
element=driver.find_element_by_class_name("ClassName")
(4)通过tag方式定位
element=driver.find_element_by_tag_name("TagName")
(5)通过link方式定位
element=driver.find_element_by_link_text("LinkText")
(6)通过partial link方式定位
element=driver.find_element_by_partial_link_text("LinkText")
(7)通过css 方式定位
1)通过class属性定位,即 .class
element=driver.find_element_by_css_selector(".ClassName")
2)通过id属性定位,即 #id
element=driver.find_element_by_css_selector("#IdName")
3)通过标签名定位,即 Tag,不建议推荐
element=driver.find_element_by_css_selector("TagName")
4)通过父子关系定位,即父级属性>子级属性
element=driver.find_element_by_css_selector("父级属性>子级属性")
5)属性定位,即[属性=属性值],属性值可加引号,也可以不加
element=driver.find_element_by_css_selector("[autocomplete=off]")
6)组合定位
element=driver.find_element_by_css_selector("span.bg.s_ipt_wr.quickdelete-wrap.soutu_nomac>input.s_ipt")
(8)通过xpath方式定位
1)通过元素属性定位
//表示当前页面某个目录下,input表示定位的元素的标签名,【@id=‘kw’】表示这个元素的id(name、class、元素的任意属性值)属性值等于kw,如果不想指定标签名,则可以使用星号(*)代替
element=browser.find_element_by_xpath(".//input[[@id](/user/id)='kw']")
element=browser.find_element_by_xpath("//*[@autocomplete='off']")
2)通过绝对路径定位
element=browser.find_element_by_xpath("path")
3)通过层级与属性结合定位,即 上一级属性/下一层级
element=browser.find_element_by_xpath("//form[[@id](/user/id)='form']/span/input")
4)通过逻辑运算符定位
<input id="kw" class="su" name="ie">
<input id="kw" class="aa" name="ie">
<input id="bb" class="su" name="ie">
想要定位第一行元素,可以这样
element=find_element_by_xpath("//input[[@id](/user/id)='kw' and @class='su'"]
- 测试脚本
- 组织测试用例
六、实践中的block以及解决方法
- 如何让A机器上的代码运行在远程B机器上?
答:
step 1 :使用appium的主从远程控制,在B机器上安装好appium服务以及模拟器
step 2 :修改B机器的appium server address,改成B机器的主机IP
step 3:将A机器上的webdrive.remote的地址修改成B机器的appium server address
-
如何让jenkins控制Windows下的模拟器执行appium代码? 答: 解决思路:使用jenkins的slave节点,将目标Windows主机设置成jenkins的slave节点 (1)添加jenkins节点 (2)根据下图进行配置 1)其中Name是slave的唯一名称标志,可以是任意字符串 2)远程工作目录:指定该节点slave的工作目录路径,建议使用绝对路径 3)启动方法:一般使用jave web启动代理该配置 4)环境变量:将python添加到里面 (3)slave设置 Slave主机安装Java JDK并配置环境,连接到jenkins的两种方法:
1)下载slave.jar,在cmd下运行: java -jar agent.jar -jnlpUrl http://jenkins.app.kl/computer/UI_TEST_APPIUM/slave-agent.jnlp -secret 0ab4173808768b617b6f19f5a8f2af9d990d7fe21fc291e221d45eaf62b04f48 -workDir "D:jenkins" 2)点击Launch下载slave-agent.jnlp,直接双击运行 注意点:jenkins启动slave可能出现报错 com.sun.deploy.net.FailedDownloadException: Unable to load resource: http://127.0.0.1:8080/jnlpJars/remoting.jar at com.sun.deploy.net.DownloadEngine.actionDownload(Unknown Source) at com.sun.deploy.net.DownloadEngine.downloadResource(Unknown Source) at com.sun.deploy.cache.ResourceProviderImpl.getResource(Unknown Source) at com.sun.deploy.cache.ResourceProviderImpl.getResource(Unknown Source) at com.sun.javaws.LaunchDownload$DownloadTask.call(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)修改办法: 到jenkins面板: http://127.0.0.1:8080, 进入Manage Jenkins ,选择Configure System, 修改Jenkins Location选项下面的Jenkins URL为master机器的http://IP:port, 然后重新生成jnlp文件发送到slave节点,然后右键选择Launch。 如果,不想修改Jenkins的 URL,那么用编辑器打开slave-agent.jnlp文件,将其中的127.0.0.1修改为master机器的IP或者域名即可。
(4)新建一个job
六、未来的发展?
- 支持多设备同时运行
- 将appium应用到IOS上
- 将客户端和服务端都部署在linux环境下,实现全自动化
写在最后的话
测试小哥哥为了这次的分享,做了很多准备,感动到我就想把他的微信号放上来了。但小哥哥为人低调,是个喜欢默默啃书的男人~ anyway,如果你也喜欢我们这样的分享环境,欢迎你投递简历到邮箱jobs@kalengo.com,我们欢迎技术的小哥哥们毛遂自荐!
Node.js的朋友们戳这里投简历:Node.js开发工程师
区块链的朋友们戳这里投简历:区块链开发工程师
量化开发的朋友们戳这里投简历:量化开发工程师
著作权归本文作者所有,未经授权,请勿转载,谢谢。