zoukankan      html  css  js  c++  java
  • Appium 自动化测试

    1.Appium介绍
    1,appium是开源的移动端自动化测试框架;
    2,appium可以测试原生的、混合的、以及移动端的web项目;
    3,appium可以测试ios,android应用(当然了,还有firefoxos);
    4,appium是跨平台的,可以用在osx,windows以及linux桌面系统上;
    2.Appium基本原理
    在Android端,appium基于WebDriver协议,利用Bootstrap.jar,最后通过调⽤
    用UiAutomator的命令,实现App的自动化测试。
    UiAutomator测试框架是AndroidSDK自带的AppUI自动化测试Java库。
    另外由于UiAutomator对H5的支持有限,appium引入了chromedriver以及
    safaridriver等来实现基于H5的自动化。

    2.1.appium在android端工作流
    1.client端也就是我们testscript是我们的webdriver测试脚本。
    2.中间是起的Appium的服务,Appium在服务端起了一个Server(4723端口),
    跟seleniumWebdriver测试框架类似,Appium⽀持标准的WebDriver
    JSONWireProtocol。在这里提供它提供了一套REST的接口,AppiumServer接
    收webdriverclient标准rest请求,解析请求内容,调⽤用对应的框架响应
    操作。
    3.appiumserver会把请求转发给中间件Bootstrap.jar,它是用java写的,安装
    在手机上.Bootstrap监听4724端口并接收appium的命令,最终通过调⽤用
    UiAutomator的命令来实现。
    4.最后Bootstrap将执行的结果返回给appiumserver。
    5.appiumserver再将结果返回给appiumclient。

    3.Appium安装配置
    3.1.限制
    如果你在windows上安装appium,你没法使用预编译专用于OSX的.app文件,
    你也将不能测试IOSapps,因为appium依赖OSX专用的库来支持IOS测试。这
    意味着你只能通过在mac上来运行IOS的app测试。这点限制挺大。
    3.2.傻瓜式安装node.js

     3.2.1.查看是否安装成功

    nodejs安装完毕后,需要配置环境变量
    在PATH中添加:D:ProgramFiles odejs;

    3.3.傻瓜式安装Appium

     3.3.1.成功界面

     3.4.配置appium环境变量

    D:Appium ode_modules.bin

    3.5.打开控制台,查看appium环境
    3.5.1.appium-doctor

    3.6.配置Android—环境变量

    D:androidSDK

    3.7.Python中配置appium环境(联网)
    进入:D:pythonScripts
    打开控制台:
    pipinstallAppium-Python-client

    3.8.总结:
    1) androidsdk安装完毕后,需要配置环境变量
    新建ANDROID_HOME
    在PATH中添加:%ANDROID_HOME%:.....
    2) nodejs安装完毕后,需要配置环境变量
    在PATH中添加:D:ProgramFiles odejs;
    3) appium安装完毕后,需要配置环境变量
    D:ProgramFiles(x86)Appium ode_modules.bin;
    4) 配置好后,启动cmd,
    输入node-v,查看node安装版本
    输入appium-doctor检查appium的安装环境是否成功,
    5) 安装Python,配置环境变量

    4.第一个脚本示例
    4.1.首先通过eclpse启动android模拟器

     4.2.启动Appium

    4.3.点击左上角有“机器人”的按钮:
    选择你的android版本

     4.4.点击右上角的“三角”按钮启动Appium。

     

    4.5.通过Python编写自动化测试脚本。
    desired_caps是一个字典,用于在appiumserver与手机端建立会话关系时,手
    机端需要告诉服务端设备相关的一些参数,根据这些参数服务端可以做出相应的
    处理。

     4.6.画出来的这三个,是需要在脚本中正确填写的

     4.7.执行效果

    5.Appium界面内容解析
    5.1.整体介绍
    主页面顶部从左到右依次是:
    1、AndroidSettings:android相关的设置
    2、GeneralSettings:全局设置,设置appium相关的内容
    3、DeveloperSettings:开发者设置,一般不用需要关心
    4、About:appium相关信息,不需要关心
    5、Inspector:查找元素用的,windows无法使用,MAC可以使用,windows可
    以不用关心。
    6、LaunchAppium:启动appium按钮
    7、右下角清除日志按钮。

    5.2.AndroidSettings
    此页面分为Application、La、、四部分,先看图
    之后分析分别有什么作用

    5.2.1.1、Application
    本模块设置被测试app信息,如安装包路径、包名、activity等
    ApplicationPath:选择要测试的apk,选择他后与全局设置中的
    Pre-LaunchApplication配合,启动appium时会先把apk安装到手机(或模拟器)
    再启动app。
    Package:根据apk生成的app包名,之前提到过的,我们这个包的身份证,我

    们需要通过这个去找到包,不然我们安装后我们通过什么去辨别这些包呢?
    WaitforPackage:等待包名。

    LaunchActivityactivityActivity
    就是其中的一个个网页,我们启动app时需要去运行的activity,这里我们填写
    首次启动页面的activity。我们选择第一启动的activity与aapt命令生成的
    launchable-activity:name一致

    WaitforActivity:和上面的差不多,意思是等待某个Activity打开,用的时间不是
    很多,做了解。
    UseBrowser:测试浏览器选择这项,与前五项互逆。及选择了他前五个就不可以
    选择。
    FullReset:将所有设置复位。即将手机(模拟器)恢复到启动到appium前的状

    NoReset:不需要重置手机(模拟器)中的app

    6.2.2.LaunchDevice
    本模块是模拟器设置,针对的是SDK创建的模拟器,不是genymotion等其
    他模拟器。
    LaunchAVD:要启动的模拟器名称。
    DeviceReadyTimeout:等待模拟器启动时间。
    Arguments:启动模拟器时需要的参数。
    6.2.3.Capabilities
    运行测试的相关信息。
    PlatformName:测试平台,可以选择Android、FireFoxOS、MAC版的还可以选择
    IOS。

    PlatformVersion:被测试手机(模拟器)版本。
    DeviceName:设备名称,手机连接电脑后打开cmd输入adbdevices可获取。
    Language:被测试手机(模拟器)使用语言。
    Locale:被测试手机(模拟器)所属区域。

    5.4.元素侦测:
    这个按钮的功能和firebug的定位工具功能类似,但是他还有一个功能,他会检
    测你的各个系统配置是否正确,如果前面各项参数不正确时,使用该功能会报错。
    如果你不正常连接手机也不行。还是建议用sdk工具里面自带的
    uiautomatorviewer。
    5.5.启动服务
    所有参数配置好后你需要做的就是启动appium服务,只有启动之后你才能够做
    自动化。
    5.6.清除日志(右下角):
    在写脚本、调试过程中会产生很多的日志,但是你可能想看的只是中间某个时间
    段的,那么你在这个时候可以将页面的日志清除。

    6.Appium查看界面元素的工具
    6.1.通过androidsdk的uiautomaterviewer获取元
    素内容

     

    uiautomatorviewer.bat是一个用来来扫描和分析Android应用程序的UI组件的
    GUI工具。具体使用方法可参考。打开uiautomatorviewer以后,可以看到
    uiautomatorviewer已经将模拟器的图形展示在上面了。

     6.2.右侧xml节点详解

     

    7.获取appPackage和appActivity
    appPackage和appActivity进行appium自动化测试非常重要的两个参数,
    我们所测试的APP不同,这两个参数肯定也是不一样的。那如何快速的获取这
    APP的这两个参数呢

    7.1.方法一:通过cmd指令来获取

    1.adbshell
    2.dumpsysactivity|grepmFocusedActivity

    3、adbshelldumpsysactivityactivities

    7.2.方法二:使用Appium来获取
    进入设置页,选择APK路径,下面就会显示包名和Activity名称

    8.Appium常用定位方法讲解
    对象定位是自动化测试中很关键的一步,也可以说是最关键的一步,毕竟你对象
    都没定位那么你想操作也不行,下面我们来看我们常用的一些定位方式。

    8.1.ID定位(取resource-id的值):
    无论是在web自动化还是app自动化中id都是唯一的,可能有的小伙伴看
    到这里会有疑问,因为有的资料说是通过name定位是唯一的,为什么你这里是
    id呢,其实这个在之前是不冲突的,但是如果你用的是appium较新版本是不行
    的,在新版本中name定位被去掉了,所以在以后的定位中不会有name定位了,
    通常情况下我们也更喜欢用id进行定位。这里可能刚学的小伙伴会有疑问,
    有的时候你的应用为什么没有id,或者说在这个手机上有但是另外的手机上
    没有。1、开发没有添加。2、android版本是4.4以下的。
    如果我们需要对“7”这个数字进行点击操作,
    driver.find_element_by_id("com.android.calculator2:id/digit7").click() 

    8.3.className定位(取class的内容)
    在实际工作中className定位用得相对而言会比较少。当你经常去看class
    时你会发现很多的className是一样的,你没有办法对其进行唯一定位,下面我
    们看下面两张图片

    driver.find_element_by_class_name("android.widget.EditText").send_keys("111111")
    这种方式去定位,你会发现你永远定位不了密码栏,这是为什么呢?因为在设计
    的时候如果你查找的元素在页面有多个,系统会自动给你选择第一个,所以你永
    远操作不了后面的

    8.4.text定位(需要使用uiautomator的定位方式,
    使用text的内容)

    使用这里需要注意一下,如果通过text定位的结果是个list,不能直接click。所
    以如果要点击需要取数组的值,比如下面是点击找到的第一个元素

     8.5.xpath定位

    xpath定位在web自动化中是最常见的,而且也是最有效的,使用xpath定
    位避免了找不到元素导致报错的问题,但是在app中使用xpath定位是一件很low
    的事情。只要遇见使用xpath定位元素他的反应就会比较慢,自动化的目的是为
    了提高效率,但是使用xpath后会降低效率,所以这里说很low

     driver.find_element_by_xpath("//android.widget.TextView[@text='JavaScript']").click()

    在xpath里面我们的语法是这样“//android.widget.TextView[@text='JavaScript']”,
    这个和我们之前web的xpath一样,意思是查找所有节点中节点为
    android.widget.TextView(这里使用的是className,也可以使用id,系统会依次
    去找)并且他的text属性值为JavaScript,这样是否更容易理解呢?下来多练习。
    这样的定位方式不推荐,效率很慢。

    8.6.css_selector定位(webview)--加载网页--css
    只适用于webview的html页面,继承自webdriver,与pc版本的UI测试一致
    driver.find_element_by_css_selector()
    8.7.link_text定位(webview)
    只适用于webview容器中的html页面,继承自webdriver,与pc版本的UI测试
    一致
    driver.find_element_by_link_text()

    8.8.源代码

    10.Appium操作界面之触摸操作(了解)
    10.1.规范中的可用事件有:
    *短按(press)
    *释放(release)
    *移动到(moveTo)
    *点击(tap)
    *等待(wait)
    *长按(longPress)
    *取消(cancel)
    *执行(perform)

    10.2.单点触摸TouchAction(driver)
    通过TouchAction对象,添加tap、move_to等操作,然后perform()执行,可以
    实现解锁屏幕等功能
    action=TouchAction(driver)
    action.press(x=220,y=700).move_to(x=840,y=700).move_to(x=220,
    y=1530).move_to(x=840,y=1530).release().perform()
    10.3.多点触控MultiAction()
    通过MultiAction().add()添加多个TouchAction操作,最后调用perform()一起执行
    这些操作
    举例
    action0=TouchAction().tap(el)
    action1=TouchAction().tap(el)
    MultiAction().add(action0).add(action1).perform()
    10.4.滑动driver.swipe(x1,y1,x2,y2,duration)
    命令解释:从坐标(x1,x2)滑动到坐标(x2,y2),duration非必填项,滑动时间(滑
    动时中间要加等待时间,不加等待时间容易出错,而且加等待时间的长短也要掌
    握好,一般在200-1000毫秒之间应该差不多,自己调试几次感觉一下哪个时间
    比较稳,每个程序可能会有所差异)
    滑动的坐标不能超过屏幕的宽高
    可以通过【driver.get_window_size()】命令获得窗口高和宽{'width':1080,'height':
    1788}
    #获得机器屏幕大小x,y
    defgetSize(driver):
    x=driver.get_window_size()['width']
    y=driver.get_window_size()['height']
    return(x,y)

    #屏幕向上滑动
    defswipeUp(driver,t=500):
    l=getSize(driver)
    x1=int(l[0]*0.5)#x坐标
    y1=int(l[1]*0.75)#起始y坐标
    y2=int(l[1]*0.25)#终点y坐标
    driver.swipe(x1,y1,x1,y2,t)
    #屏幕向下滑动
    defswipeDown(driver,t=500):
    l=getSize(driver)
    x1=int(l[0]*0.5)#x坐标
    y1=int(l[1]*0.25)#起始y坐标
    y2=int(l[1]*0.75)#终点y坐标
    driver.swipe(x1,y1,x1,y2,t)
    #屏幕向左滑动
    defswipLeft(driver,t=500):
    l=getSize(driver)
    x1=int(l[0]*0.75)
    y1=int(l[1]*0.5)
    x2=int(l[0]*0.05)
    driver.swipe(x1,y1,x2,y1,t)

    #屏幕向右滑动
    defswipRight(driver,t=500):
    l=getSize(driver)
    x1=int(l[0]*0.05)
    y1=int(l[1]*0.5)
    x2=int(l[0]*0.75)
    driver.swipe(x1,y1,x2,y1,t)

    10.5.长按示例

    10.6.2.打开界面,使用如下指令,查看activity和package

     10.6.3.编写python脚本代码

     

     11.系统按键事件(了解)

    press_keycode(AndroidKeyCode)#发送按键事件

    例如:点击home键,home键的KeyCode是3

    12.driver的一些比较重要操作
    12.1.reset()
    #重置app#这时候driver会重置,相当于卸载重装应用。所以本地缓存会失效

    driver.reset()

    12.2.start_activity(包名,activity名)
    例如:
    #启动app的某一个activity

    启动一个activity,这个activity必须是AndroidManifest.xml中有intent-filter的
    activity,对于其他的activity需要程序跳转过去

    12.3.scroll(起始元素,结束元素)

    driver.scroll(origin_el,destination_el)

    12.4.获得当前页面的所有元素

     driver.page_source

    这可以用来判断元素是否存在,例如(assert“发布成功”indriver.page_source)

    12.5.补充一些driver启动时可能用到的项(了解)
    其实这些在上一篇启动里都有介绍,但是有些可能大家没注意到的点再列一下。
    这些点也是我在测试中实际遇到的点
    autoLaunch:Appium是否要自动启动或安装app,默认true
    desired_caps[‘autoLaunch’]=‘false’
    有的时候我不想让appium每次都启动app,想自己去启动activity,那这个项
    这时就可以起作用了
    noReset:在会话前是否重置app状态。默认是false
    desired_caps[‘noReset’]=‘true’
    newCommandTimeout:设置未接收到新命令的超时时间,默认60s
    如果60s内没有接收到新命令,appium会自动断开连接,如果我需要很长时间
    做driver之外的操作,可能延长接收新命令的超时时间
    desired_caps[“newCommandTimeout”]=1800

    13.自动化测试简单案例-登录

     13.1.打开UIAutomatorViewer

     

     13.2.代码实现

    driver.find_element_by_id("com.example.login:id/et_username").send_keys("hello");

    driver.find_element_by_id("com.example.login:id/et_password").send_keys("123");

    driver.find_elements_by_class_name("android.widget.Button")[1].click()

    14.自动化测试案例2-转转
    14.1.下载转转,并打开,在初始界面查看包和
    activity

    14.2.使用UIAutomatorViewer查看转转按钮
    14.3.点击跳过

    #强制等待3秒钟
    time.sleep(3)
    #跳过按钮
    #driver.find_element_by_id("com.wuba.zhuanzhuan:id/arw").click()

    14.4.点击分类

    driver.implicitly_wait(10)
    #分类按钮
    driver.find_element_by_id("com.wuba.zhuanzhuan:id/b1v").click()

    driver.implicitly_wait(10)
    #搜索按钮
    driver.find_element_by_id("com.wuba.zhuanzhuan:id/b1p").click()

    driver.implicitly_wait(10)
    #搜索框中输入搜索内容
    driver.find_element_by_id("com.wuba.zhuanzhuan:id/mg").send_keys(u"电动车")
    time.sleep(10)
    #点击搜索

    driver.find_element_by_id("com.wuba.zhuanzhuan:id/mi").click()
    driver.quit()

    15.启信宝案例
    #coding:utf-8
    fromappiumimportwebdriver
    #desired_caps是一个字典
    desired_caps={}
    #你要测试的手机操作系统
    desired_caps['platformName']='Android'
    #手机操作系统的版本
    desired_caps['platformVersion']='7.0'
    #使用的手机类型或模拟器类型
    desired_caps['deviceName']='XPUDU17113015063'
    #deviceName你的模拟器名字,就是在下载AVD的时候,你填写的,忘
    了的回头去找,或者在模拟器顶部会显示
    #所运行的app包名
    desired_caps['appPackage']='com.bertadata.qxb'
    #app运行的事件
    desired_caps['appActivity']='.activity.SplashActivity'
    #启动打开app
    driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',
    desired_caps)
    #根据元素定位,执行点击操作
    driver.implicitly_wait(10)
    serh=
    driver.find_element_by_id("com.bertadata.qxb:id/tv_home_searc
    h_desc")
    serh.click()
    driver.find_element_by_id("com.bertadata.qxb:id/et_search_con
    tent").send_keys("优思安科技")
    driver.quit()

  • 相关阅读:
    ESFramework介绍之(32)―― Tcp客户端核心组件关系图
    Java -- 在Eclipse上使用XFire开发WebService
    DTS开发记录(1)--系统总体结构
    ESFramewor使用技巧(3) -- 在插件中使用Spring.net
    DTS开发记录(序)
    给关注ESFramework的朋友们 2006.06.25
    ESFramework介绍之(34)―― ITcpServerAgent和IUdpServerAgent组件关系图
    Java -- 在Eclipse上使用Hibernate
    【C#2.0】点滴(不断补充中......)
    Java -- 在Eclipse上使用Spring
  • 原文地址:https://www.cnblogs.com/ngngng/p/15338944.html
Copyright © 2011-2022 走看看