AI考拉技术分享会—手把手教你入门UI 自动化测试 Appium

893 阅读6分钟

AI考拉日常技术分享会,前有众多前后端以及android大神分享,这次测试老司机Eric也放招,手把手带devs入门UI自动化测试。话不多说,开课啦!

一、UI自动化框架的介绍

UI自动化包括哪些内容? UI自动化是通过工具或者脚本语言将测试过程模拟出来,并重复执行,用以验证功能是否正确的过程,包括:

  1. 界面层面(控件,元素,位置,显示等的识别)
  2. 功能交互层面(往往是通过代码或者测试框架来模拟真实用户的操作)

二、为什么要做UI自动化测试

  1. 敏捷开发的需要:满足产品敏捷开发、快速迭代的要求;
  2. 传统的手工测试重复度高,执行效率低;
  3. 迭代周期短,经常需要对原有功能进行回归测试.一句话:提高测试效率,方便回归旧版本!

三、常见的框架有哪些

  1. Monkey:Android SDK自带的测试工具,发送伪随机事件(按键输入、触摸屏输入、手势输入等),无法自定义,主要用于压力测试;
  2. MonkeyRunner:Android SDK提供的测试工具,比monkey强大,支持编写脚本自定义事件;
  3. UiAutomator:Android提供的自动化测试框架,仅支持Java语言和Android平台,不支持WebView;
  4. Robotium:基于Google提供的Instrumentation的测试框架,仅支持Java语言和Android平台,不支持WebView;
  5. Appium:开源、跨平台的自动化测试工具,支持Java、python等多种语言,支持android和IOS,并且支持WebView; 给个框架对比图,感受下:

综上,考拉团队选择了支持android以及ios版本、也支持WebView的Appium框架,自此打开了测试新大门.

四、Appium环境安装

  1. 安装Appium Server:需要先安装Node.js,然后再通过命令安装:npm install -g appium
  2. 安装Android SDK
  3. 安装Appium Client:通过pip命令安装.Windows下执行命令:pip install Appium-Python-Client

4. 安装安卓模拟器:推荐下载安装GenyMotion
5. 自动化脚本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实践

  1. 启动App

2. 元素定位
(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='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='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='kw' and @class='su'"]
3. 测试脚本
测试脚本_副本.jpg
4. 组织测试用例
组织测试用例.png

六、实践中的block以及解决方法

  1. 如何让A机器上的代码运行在远程B机器上?

答:

step 1 :使用appium的主从远程控制,在B机器上安装好appium服务以及模拟器

step 2 :修改B机器的appium server address,改成B机器的主机IP

appium server Address.png

step 3:将A机器上的webdrive.remote的地址修改成B机器的appium server address

地址修改.png

  1. 如何让jenkins控制Windows下的模拟器执行appium代码?
    答:
    解决思路:使用jenkins的slave节点,将目标Windows主机设置成jenkins的slave节点
    (1)添加jenkins节点
    Jenkins增加节点.png

    (2)根据下图进行配置
    1)其中Name是slave的唯一名称标志,可以是任意字符串
    2)远程工作目录:指定该节点slave的工作目录路径,建议使用绝对路径
    3)启动方法:一般使用jave web启动代理该配置
    jenkins远程工作.png

    4)环境变量:将python添加到里面
    jenkins环境变量.png

    (3)slave设置
    Slave主机安装Java JDK并配置环境,连接到jenkins的两种方法:
    1)下载slave.jar,在cmd下运行: java -jar agent.jar -jnlpUrl jenkins.app.kl/computer/UI… -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

新建job1.png

六、未来的发展?

  1. 支持多设备同时运行
  2. 将appium应用到IOS上
  3. 将客户端和服务端都部署在linux环境下,实现全自动化

写在最后的话

测试小哥哥为了这次的分享,做了很多准备,感动到我就想把他的微信号放上来了.但小哥哥为人低调,是个喜欢默默啃书的男人~ anyway,如果你也喜欢我们这样的分享环境,欢迎你投递简历到邮箱jobs@kalengo.com,我们欢迎技术的小哥哥们毛遂自荐!

Node.js的朋友们戳这里投简历:Node.js开发工程师
区块链的朋友们戳这里投简历:区块链开发工程师
量化开发的朋友们戳这里投简历:量化开发工程师

著作权归本文作者所有,未经授权,请勿转载,谢谢。