Appium1.4 的简介、装配及其使用真机测试(IOS版)

Appium1.4 的简介、安装及其使用真机测试(IOS版)

(我使用的是真机测试,使用模拟器还没有研究过)

一、关于Appium

  • 1,appium是开源的移动端自动化测试框架;
  • 2,appium可以测试原生的、混合的、以及移动端的web项目;
  • 3,appium可以测试ios,android应用(当然了,还有firefox os);
  • 4,appium是跨平台的,可以用在osx,windows以及linux桌面系统上;

具体用什么语言开发,看公司的业务和要求了,我选择的是java语言,主要是考虑自己对java语言比较熟悉。。。当然java语言有一个缺点就是速度不快,运行一个用例半天没结束实在是等得人着急。官方给的语言很多这些都是。


 

二、基本原理

 Appium的官方网站http://appium.io/index.html?lang=zh

具体Appium的一些信息还是需要到官方网站去了解,我这里只是简单的Appium做一个介绍,当然,大部分还是参考了官方上的和别人的一些东西。

        Appium可以驱动多种原生自动化框架,同时也提供基于Selenium WebDriver JSONwire protocol api。基于Dan Cuellar's iOS自动化上的成果,Appium通过驱动 AppleUIAutomation库来提供iOS支持。而在新版本的Android上,我们使用 Uiautomator框架,老版本的Android,则使用了 SelendroidFirefoxOS的支持依赖一个基于Gecko平台并且兼容 WebDriver的自动化驱动Marionette

具体工作模式如下


appium ios封装了apple的 Instruments框架,主要用了Instrument里的UIAutomation(Apple

的⾃自动化测试框架),然后在设备中注⼊入bootstrap.js进⾏行监听。

1.左边的WebDriver script是selenium测试脚本

2.中间是起的Appium的服务,Appium在这边起了⼀一个Server(4723端口),跟selenium Webdriver测试框架类似,Appium⽀支持标准的WebDriverJSONWireProtocol 。在这里提供了一套web服务,Appium Server接收web driver标准请求,解析请求内容,调⽤用对应的框架响应操作。

如:脚本发送一个点击按钮的请求给appiumserver,

3.appium server调用instruments.js 启动⼀一个socket server,同时分出⼀一个⼦子进程运⾏行

instruments.app,将bootstrap.js(一个UIAutomation脚本)注⼊入到device⽤用于和外界进⾏行交

互。

 

、Appium的下载和安装

 下载的地方很多,官方下载http://appium.io 首页进去就有下载的链接。

另外这个网站不知道是怎么回事,提供了Appium下载的链接和一些资料,网站地址如下

https://bitbucket.org/appium/appium.app/downloads/

下载完dmg文件后怎么安装大家都知道了,图标如下


 

对于一般的测试,基本也就是用下面这几个功能了。


当然这只是安装完Appium这个软件。

接这点击苹果图标

 


真机测试的话,只需要填好这几个,第一个bundleId是应用程序的BundleId,选一下你的设备还有系统平台,最后是设备的UDID。设备的UDID的话会打开Xcode可以查看

 

配置好之后,点击launch,等一会


从上面一个界面变到下一个界面


点击左上角的放大镜


 

正常情况下是打不开inspector的。而且可以看到出现错误

error: Failed tostart an Appium session, err was: Error: Could not initialize ideviceinstaller;make sure it is installed and works on your system

提示我们没有安装ideviceinstaller

 

安装这个并不难我们只要使用如下的命令就可以

brew install ideviceinstaller

如果没有安装brew是会报错的。

 

熟悉brew的人可能有很多,如果不熟悉的话建议看一下brew一些教程,这是一个很方便的工具可以安装应用等等各种。当然,我电脑里面并没有安装,所以我得安装一下brew,可以到homebrew官网上去下。

安装brew很简单,一个命令

ruby -e "$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/install/master/install)"

 


不过我安装的时候报这个问题了,一看就知道怎么解决了,打开Xcode,然后再运行一次命令,OK。

 

 


这样就安装好了。

 

然后重新执行一下命令

brew installideviceinstaller

 


 

当然,这样就差不多了,不过,最后还有一个步骤,就是修改ios.js文件。

文件目录如下

/Applications/Appium.app/Contents/Resources/node_modules/appium/lib/doctor

进去后可以看到一个ios.js文件


 

打开文件,并修改原来的代码如下。注意不要改错。


修改完成后,环境基本就已经配置好了。

下面就是具体的自动化测试了


四 、基本的使用

点击Lanch等出现如下的log后,点击放大镜图标打开inspector


 

然后我们就可以看到里面的控件树了。看这个的目的是为了知道里面的结构便于我们写测试用例。

使用Record按钮可以对我们的动画进行录制,使用Refresh可以对界面进行刷新,在研究控件树的时候我手动跟新界面然后可以使用这个进行刷新。

record方法的主要作用就是可以对自己动画进行录制。然后生成相应的代码,比如我在控件树里面选择某个按钮后,点击下面的tap,swip,snake之类的,就可以看到下面生成的代码。这些代码显得太过简单了,这只是一个简单的示例 真正的测试要比这个复杂很多了。


上面生成的java代码其实就是一个代码的模型。

好了下面打开Eclipse新建一个工程

建一个FirstTest类,导入具体的包后。包的下载地址:Appium java jar 包下载

publicclassFirstTest{
@SuppressWarnings("unused")
public IOSDriverdriver;
publicFirstTest()throws Exception{
}
  @Before
  public voidsetup() throws Exception { 
            DesiredCapabilities capabilities =new DesiredCapabilities();
capabilities.setCapability("appium-version","1.0");
capabilities.setCapability("platformName","iOS");
            capabilities.setCapability("platformVersion","8.1.2");
           capabilities.setCapability("deviceName","iPhone 5s");
           capabilities.setCapability("app","com.sina.weibo"); 
   driver =new IOSDriver(new URL("http://127.0.0.1:4723/wd/hub"),                capabilities);   
  }
  @After
  public voidtearDown() throws Exception {
    driver.quit();
  }
 //应用打开10秒后锁屏
    @Test
    public voidfirstTest(){
    driver.lockScreen(10);
    }
}


  如果你没写过测试用例,建议先学习一下,实在不行的话知道怎么运行就可以了,@After @Before是用例执行后,和执行前的准备,运行用例的话,右键某一条用例RunAs  -Junit  Test就可以

 


这样就可以了,用例就OK了。如果你写了很多用例,要都测试一遍的话,直接类目右键,RunAs  -Junit  Test就可以

 


 

     driver是测试最基础最主要的类,可以看到我们在setup方法里面对driver进行了实例化,也可以直接在构造方法里面进行实例化。记得不要写漏了tearDown方法,如果缺少这个方法的话在很多用例一起测试的时候是不行的,只有使用这个才能完全的退出应用程序。

   另外需要注意一点的是在使用的时候记得手机的锁屏时间调为永不锁屏,否则在多个用例一起执行的时候肯定是会出问题的。一些其他可能遇到其他的问题我的博客里面有

Appium一些错误总结

   开发的时候对方法多做一些封装,直接的使用API会对代码的复用会比较差。

  下面是附上Appium的API


五、Appium 之 java API

 

AppiumDriver

getAppStrings()      默认系统语言对应的Strings.xml文件内的数据。

driver.getAppStrings(Stringlanguage)      查找某一个语言环境对应的字符串文件Strings.xml内数据

sendKeyEvent(intkey)       按下某个键,具体哪个键由key值决定,key值定义在AndroidKeyCode类中

 sendKeyEvent(intkey, Integer metastate)  按下某个键的同时按下附加键(Ctrl/Alt/Shift等),具体是哪些键,由key值(AndroidKeyCode类中定义)和metastateAndroidKeyMetastate类中定义)决定。

currentActivity()        获取当前activity,比如(.ApiDemos

isAppInstalled(StringbundleId)   根据bundleId来判断该应用是否已经安装

 installApp(StringappPath)    安装appappPath为应用的本地路径

removeApp(StringbundleId)   卸载app.bundleIdandroid中代表的是报名,而在ios中有专门的bundleId号。

closeApp() 关闭应用,其实就是按home键把应用置于后台

launchApp()  启动应用

resetApp()   closeApp然后在launchAPP

 pushFile(StringremotePath, byte[] base64Data)   将字符数组用64位格式写到远程目录的某个文件中。也可以理解为把本地文件push到设备上。

 pullFile(StringremotePath)     将设备上的文件pull到本地硬盘上

 pullFolder(StringremotePath)    将设备上的文件夹pull到本地硬盘上,一般远程文件为/data/local/tmp下的文件。

setNetworkConnection(NetworkConnectionSettingconnection)   设置手机的网络连接状态,可以开关蓝牙、wifi、数据流量。通过NetworkConnectionSetting中的属性来设置各个网络连接的状态。

getNetworkConnection()   得到当前网络的状态

openNotifications()   打开通知栏

runAppInBackground(intseconds)    resetApp类似,区别是resetApp关闭后立即启动,而这个方法是关闭后等待seconds秒后再启动。

hideKeyboard()   ios隐藏键盘

hideKeyboard(Stringstrategy, String keyName)   隐藏键盘,只能用于ios上。

performTouchAction(TouchActiontouchAction)   执行一个touch动作,该touch动作是由TouchAction封装的。

 performMultiTouchAction(MultiTouchActionmultiAction)  执行多步touch动作,由MultiTouchAction封装的多步操作。

 tap(intfingers, WebElement element, int duration)    点击element控件中心点按下,duration*5毫秒秒后松开,如此重复fingers次。

tap(intfingers, int x, int y, int duration)   点击(x,y)点按下,duration*5毫秒后松开,如此重复fingers次。

 swipe(intstartx, int starty, int endx, int endy, int duration)   (startx,starty)滑到(endx,endy),分duration步滑,每一步用时是5毫秒。

 pinch(WebElementel)    2个手指操作控件,从对角线向中心点滑动。

 pinch(intx, int y)   以(x,y)为基准,计算得出(x,y-100,(x,y+100)两个点,然后2个手指按住这两个点同时滑到(x,y

 zoom(WebElementel) pinch(el)的动作刚好相反。两个手指由控件的中心点慢慢向控件的左顶点后右底点滑动。

 zoom(intx, int y) pinch(x,y)相反。两个手指从(x,y)点开始向(x,y-100)和(x,y+100)滑动。

 getNamedTextField(Stringname) 一般用在ios中。根据accessibility id获得控件对象。

 endTestCoverage(Stringintent, String path) 结束测试覆盖率的检测。(没用过,不太了解)path.ec文件的路径。

 lockScreen(intseconds)   锁屏多少秒后解锁

 shake() 模拟摇晃手机(目前还没实现)

 scrollTo(Stringtext) 滚动到某个text属性为指定的字符串的控件

 scrollToExact(Stringtext)  滚动到某个text属性包含传入的字符串的控件

 context(String name设置上下文

 getContextHandles()  可用上下文

 getContext()  当前上下文

 rotate(ScreenOrientationorientation)  设置屏幕横屏或者竖屏

 getOrientation() 获取当前屏幕的方向

 findElementByIosUIAutomation(Stringusing)    利用ios中的uiautomation中的属性来获取控件

 findElementsByIosUIAutomation(Stringusing) 和上面一样,不过获得的是多个控件

 findElementByAndroidUIAutomator(Stringusing) 利用androiduiautoamtor中的属性来获取单个控件。

 findElementsByAndroidUIAutomator(Stringusing) 和上面一样,但是该方法获得是多个控件

 findElementByAccessibilityId(Stringusing) 利用accessibility id来获取单个控件

 findElementsByAccessibilityId(Stringusing)利用accessibility id来获得多个控件

 TouchAction    AppiumDriver的辅助类,主要针对手势操作,比如滑动、长按、拖动等。TouchAction的原理是讲一系列的动作放在一个链条中,然后将该链条传递给服务器。服务器接受到该链条后,解析各个动作,逐个执行。

press(WebElementel)  在控件上执行press操作。

 press(intx, int y) 在坐标为(x,y)的点执行press操作

 press(WebElementel, int x, int y) 在控件el的左上角的x坐标偏移x单位,y左边偏移y单位的坐标上执行press操作。

 release() 释放操作,代表该系列动作的一个结束标志。

 moveTo(WebElementel) el为目标,从另一个点移动到该目标上

 moveTo(intx, int y)以(x,y)点为目标,从另一个点移动到该目标上

 moveTo(WebElementel, int x, int y)以控件el的左上角为基准,x轴向右移动x单位,y轴向下移动y单位。以该点为目标,从另一个点移动到该点上。

 tap(WebElementel) 在控件的中心点上敲击一下

 tap(intx, int y)在(x,y)点轻击一下

 tap(WebElementel, int x, int y) 以控件el的左上角为基准,x轴向右移动x单位,y轴向下移动y单位。在该点上轻击。

 waitAction() 代表一个空操作,等待一段时间

 waitAction(int ms) 等待ms

 longPress(WebElementel) 控件长按

 longPress(intx, int y)  点长按

 longPress(WebElementel, int x, int y)  偏移点长按

cancel() 取消执行该动作

perform()  执行该动作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值