UI层自动化测试框架(二):Appium基础

申明:本章节引用很多第三方资料和网上的教程,在参考资料tab中我都有备注,请理解。
由于该框架是基于Appium的,所以先讲讲appium的基础知识

一:Appium介绍

Appium是由nodejs的express框架写的Http Server。Appium不是它⾃⼰创建⼀套新的测试框架,是将现有的优秀的框架进⾏了集成,以Selenium WebDriver的协议(JsonWireProtocol/Restful web service)统⼀起来. 使得这个框架满⾜多⽅⾯的需求。Appium启动⾃动化测试后,在被测设备上启动⼀个server,监听来⾃Appium server的指令。不同的平台(如IOS,Android)采⽤不同的运⾏和交换⽅式。Appium将某个桩程序“侵入”平台,用于接受指令,来完成测试脚本的运行。

特性:
1. 跨平台, native hybrid webview(H5)
2. 跨设备, android iOS
3. 跨app,可以在多个app之间交互
4. 不依赖APP开源代码( Android 对H5的支持需要代码支持,这里不细说)
5. 支持Selenium WebDriver / Selenium Grid
6. 跨语言, java python ruby nodejs
7. Open Source

二:Appium工作原理

Android端

1.原理图:
这里写图片描述

在Android端,appium基于WebDriver,并利⽤用Bootstrap.js,最后通过调⽤用UiAutomator的命令,实现App的自动化测试。UiAutomator测试框架是Android SDK⾃自带的App UI自动化测试Java库。另外由于UiAutomator对H5的⽀支持有限,appium引入了chromedriver来实现基于H5的自动化。

2.主要原理:

  • 左边的WebDriver script是我们的selenium测试脚本
  • 中间是起的Appium的服务,Appium在这边起了一个Server(4723端口),跟selenium Webdriver测试框架类似,Appium⽀支持标准的WebDriver JSONWireProtocol 。在这里提供了一套web服务,Appium Server接收web driver 标准请求,解析请求内容,调⽤用对应的框架响应操作。如:脚本发送一个点击按钮的请求给appium server
  • appium server会把请求转发给中间件Bootstrap.jar ,它是用java写的,安装在手机上.Bootstrap 接收appium 的命令(4724端口),最终通过调⽤用UiAutomator的命令来实现
  • 最后执⾏行的结果由Bootstrap返回给appium server
  • 另外,appium还用到了chromedriver来⽀支持基于H5(webview)的测试

iOS端

1.原理图:
这里写图片描述

在IOS端,appium同样使⽤用WebDriver的⼀一套协议。与Android端测试框架不同的是,appium ios封装了apple的 Instruments框架,主要用了Instrument里的UI Automation(Apple的⾃自动化测试框架),然后在设备中注⼊入bootstrap.js进⾏行监听。

2.主要原理

  • 左边的WebDriver script是selenium测试脚本
  • 中间是起的Appium的服务,Appium在这边起了⼀一个Server(4723端口),跟selenium Webdriver测试框架类似,Appium⽀支持标准的WebDriver JSONWireProtocol 。在这里提供了一套web服务,Appium Server接收web driver 标准请求,解析请求内容,调⽤用对应的框架响应操作。如:脚本发送一个点击按钮的请求给appium server。
  • appium server调用instruments.js 启动⼀一个socket server,同时分出⼀一个⼦子进程运⾏行instruments.app,将bootstrap.js(一个UIAutomation脚本)注⼊入到device⽤用于和外界进⾏行交互
  • 对于H5的操作,运⽤用了 iOS webkit debug proxy来实现
    http://appium.io/slate/en/v1.0.0/?java#ios-support
    https://github.com/google/ios-webkit-debug-proxy

三:安装Appium

这一部分,其实网上都有非常详细的教程,这里就不一一阐述
主要的步骤为:

  • 安装JDK并配置环境变量
  • 安装Android SDK并配置环境变量
  • 安装Nodejs
  • 安装appium
  • 验证安装

相关资料:
Appium for Windows环境搭建: http://www.cnblogs.com/tobecrazy/p/4562199.html
Appium for iOS 环境建: http://www.cnblogs.com/tobecrazy/p/4970188.html

四:DesiredCapabilities

DesiredCapabilities携带了一些配置信息,在启动session 时必须提供,如启动模式,apk/app配置,package/activity配置,浏览器配置,键盘配置。从本质讲 是一组 key- value形式的对象 ,你可以理解为java里的json对象。(你可以在selenium-api-2.49.0- sources.jar 查看CapabilityType的声明)

DesiredCapabilities的重要作用是在启动时传递信息给Appium Server。可以粗略的分为两类:设备信息类和应用信息类

  • 设备信息:设备是真机还是模拟器,手机操作系统以及版本等。
  • 应用信息:要进行浏览器测试还是移动端测试,如果是移动应用,安装apk或者app文件的路径,如果是浏览器测试,浏览器的类型是什么。

下图列举了DesiredCapabilities常用的关键字:
这里写图片描述

Session介绍

Session是指一个在终端用户与交互系统进行通讯的会话,用于保持状态的基于web服务器的方法。将Appium理解为server端,客户端设备发起command的必须是在session start后才可以进行的。一般来说,通过post/session这个url,然后传入DesiredCapabilities就开启session啦。

DesiredCapabilities的使用:

Android:

DesiredCapabilities caps = new DesiredCapabilities();
// apk地址,不需要安装的话这行不需要
// File app=new File("C:\\Users\\charlie.chen\\djigo.apk");
// 不需要安装的话就去掉这个
// caps.setCapability("app", app.getAbsolutePath());

caps.setCapability("platformName", "Android");
caps.setCapability("platformVersion", "6.0");
caps.setCapability("deviceName", "P9");
caps.setCapability("udid", udid);
caps.setCapability("appPackage", appPackage);
caps.setCapability("appActivity", appActivity);
// caps.setCapability(MobileCapabilityType.BROWSER_NAME, "Chrome");
caps.setCapability("unicodeKeyboard", "True"); // 支持中文输入
caps.setCapability("resetKeyboard", "True"); // 重置输入法为系统默认

iOS:

DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability("platformName", "iOS");
caps.setCapability("platformVersion", "9.3");
caps.setCapability("deviceName", "iPhone 6s");

caps.setCapability("unicodeKeyboard", "True");
caps.setCapability("resetKeyboard", "True");

五:元素的定位

UIAutomatorViewer是Andorid SDK自动的一个app元素查看工具,通过这个工具我们可以查看app view上面的元素的属性,然后再利用Appium各个API对元素进行定位操作。

UIAutomatorViewer使用:

  • 将测试设备连接电脑,并且将被测app签名后安装在测试机。
  • 打开安装的SDK文件夹,在sdk/toos下找到uiautomatorviewer.bat,运行
    这里写图片描述

如图右下方可以看到定位的元素属性:index,text,id,classname,。。。。

常见的元素定位的方法:

  • 通过id定位:
dirver.findElement(By.id("id is me"));
  • 通过name定位
dirver.findElement(By.name("name is me"));    //name其实就是text
  • 通过clssName定位
dirver.findElement(By.className("className is me"));
  • 通过xpath定位
dirver.findElement((By.xpath("//android.widget.TextView[contains(@text,'天空之城')]"));
  • List遍历
List<WebElement> textViewList=driver.findElements(By.id("id is me"));
textViewList.get(0).sendKeys("Some Name");
textViewList.get(1).sendKeys("some@example.com");
  • 通过坐标定位
TouchAction to = new TouchAction(driver);
try {
        to.tap(x, y).release().perform();
    }

六:一个简单的脚本

package com.appium.demo;

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import io.appium.java_client.android.AndroidDriver;

import java.io.File;
import java.net.URL;
import java.util.List;

public class AppDemo {
    public static void main(String[] args){
        private  AndroidDriver  driver;

        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
        capabilities.setCapability("platformName", "Android");
        capabilities.setCapability("deviceName","Android Emulator");
        capabilities.setCapability("platformVersion", "4.4");
        capabilities.setCapability("app", app.getAbsolutePath());
        capabilities.setCapability("appPackage", "com.example.demo");
        capabilities.setCapability("appActivity", ".WelcomeAcitvity");
        driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
    }

        WebElement el = driver.findElement(By.name("Add Contact"));
        el.click();
        List<WebElement> textViewList=driver.findElements(By.id("id is me"));
textViewList.get(0).sendKeys("Some Name");
textViewList.get(1).sendKeys("some@example.com");
        driver.findElementByName("Save").click();

        driver.quit();
    }

}

参考资料

appium官网资料:http://appium.io/slate/cn/1.5/?java#about-appium
appium 官方github:https://github.com/appium
appium工作原理:http://blog.sina.com.cn/s/blog_60c53af50102v3sb.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值