目录
简单说明
首先介绍一下我这里提到的手机H5页面是什么东西,做APP测试的同学应该都知道手机APP里面也嵌入了一些H5页面,就是通过APP内嵌的webview组件去承载的页面。但是我这里做的手机H5的测试不是APP内嵌的H5,而是通过手机浏览器打开的页面,也就是普通的网页。比如我们下面的实例中用到百度的手机网页版 http://m.baidu.com
之所以这么啰嗦的区分这两种H5是因为用appium做UI自动化,测试APP里面的H5和测试手机浏览器打开的H5的操作流程上是有所区别的。比如要测试APP内嵌的H5需要先操作appium启动APP,然后通过context切到webview模式,才能操作H5页面,但是如果测试手机网页的话就比较简单了,设置好浏览器比如选择Chrome,直接访问网址就好了。如果抛开外面的框架不说,单纯两种H5页面的测试上是没有太大区别的。
准备测试环境
- 最重要也是最基本的安装appium,appium的安装这里就不过过多的介绍了,可参加这位仁兄的博客:https://blog.csdn.net/liuchunming033/article/details/51544633
- 安装JDK,Maven ,开发语言我选择的是Java,因为比较熟。也可以选择Python等,因为appium支持多语言
- 安装adb,需要使用它去连接测试机或者模拟器,如果使用iPhone的话还需要安装Xcode
搭建测试框架
测试库的构建就是按照上图的框架来操作的,为了简单起见,没有引入过多的复杂功能,比如测试用例的管理,测试日志的管理等,只有简单的测试用例。我们先按照上图简单介绍一下各个模块。
- BaseDriver主要作用就是负责与测试机或者模拟器之间建立连接
- PageObjects这个模块其实是一种成熟的UI页面测试模式,就是把每个单一的页面写到一个类里面,包括页面的元素,页面的操作等等,这样便于维护。我这里把这个模块又细分成了两个模块,一个是页面模块另一个是页面元素模块,考虑到页面元素太多为了便于管理和升级改动我单独把元素从页面里面拉出来,这个后面会详细介绍
- PageNavigator这个模块功能很简单,其实就是个页面池子,测试中用到的页面对象会写入池子,用的时候再取出来,这个模块其实是为了方便测试用例级别操作页面更简洁一些,
- TestCases这个模块就不用过多的介绍了,就是测试用例
- GlobalVars & TestData这模块用户存放测试中用到的变量和测试数据
对应代码层面是这个样子的
各模块详细介绍
BaseDriver
废话不多说了先上代码,通过代码做展开说明
package testdriver;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.ios.IOSDriver;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import testdata.GlobalVars;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Properties;
public class BaseDriver {
public static WebDriver driver;
/**
* 启动driver
* @return
*/
public void startDriver() throws MalformedURLException {
/**
* 初始化appium webdriver
*/
initializeTestData();
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("deviceName", GlobalVars.DEVICE_NAME);
capabilities.setCapability("browserName", GlobalVars.BROWER_NAME);
capabilities.setCapability("platformVersion", GlobalVars.PLATFORM_VERSION);
capabilities.setCapability("platformName", GlobalVars.PLATFORM_NAME );
capabilities.setCapability("noReset", GlobalVars.NO_RESET);
capabilities.setCapability("unicodeKeyboard", true);
capabilities.setCapability("resetKeyboard", true);
if (GlobalVars.PLATFORM_NAME.contains("iOS")){
capabilities.setCapability("udid", GlobalVars.UDID);
driver = new IOSDriver(new URL(GlobalVars.APPIUM_SERVER), capabilities);
}else{
driver = new AndroidDriver(new URL(GlobalVars.A