为什么要使用Appium?
1、工作需要,跟上步伐
2、Appium除了安装环境麻烦了点,其他都还算便利吧
最新版Appium和旧版本Appium的区别在哪里?
新版本:
旧版本:
了解的不多,后续更新
一、两种客户端安装方式(以android为例)
(1) 客户端方式
下载&安装客户端
http://appium.io/打开客户端,先按默认设置,再点击启动按钮
- 运行demo程序,并观察日志
其中:
capabilities.setCapability("unicodeKeyboard", true);
capabilities.setCapability("resetKeyboard", true);
防止android键盘自动弹出
(2) 命令行安装
- 安装官网说的:
brew install node # get node.js
npm install -g appium # get appium
npm install wd # get appium client
appium & #
PS:
首先 mac下安装homebrew
https://brew.sh/
- 安装appium-doctor
npm install appium-doctor -g
建议安装完后重启下mac
测试环境环境是否健全:
appium-doctor
- 启动Applium
appium --platform-name "Android" --platform-version "7.1.2" --no-reset --chromedriver-port "9514" --app-pkg "your-app-package" --app-activity "your-app-activity"
启动后如下图:
4. 执行demo,并观察日志
android 获取包名的方式:
http://blog.csdn.net/jane1229/article/details/39937015
二、以IOS为例
- 按照上面android的安装方法后,打开客户端,然后运行脚本
出现报错:
解决方法:
npm install -g ios-deploy
- 安装ios-deploy后,还是报这个错,没办法只好用命令行方式
- 下载webdriveragent并编译
ps:首先不确定,是否一定要自己编译。。改天去找找官方文档吧,坑
http://cdn2.jianshu.io/p/ae8846736dba - ios手机上确保已安装了webdriveragent后,打开命令“appium”,启动demo程序
- 到此,一切安装成功,程序也出结果了:test begin
三、h5的例子
使用macaca读取元素
http://www.jianshu.com/p/8b48f8105880
使用chrome开发者工具,读取元素
1、连上手机
2、使用chrome打开链接:chrome://inspect/#devices(不要勾选:Discover USB devices、Discover network targets)
3、选择手机,查看需要的h5页面,定位元素,获取xpath、cssSelector等
使用uiautomatorViewer读取元素
以android为例子
1、准备好app
2、准备好代码
@Test
public void test() throws InterruptedException {
driver.findElement(By.id("rbtn_test")).click();
driver.findElement(By.id("btn_start")).click();
WaitTool.waitForVisible(driver, By.xpath("//*[@resource-id=\"app\"]/android.view.View[2]/android.view.View[1]/android.view.View[1]/android.view.View[1]"),15);
driver.findElement(By.xpath("//*[@resource-id=\"app\"]/android.view.View[2]/android.view.View[1]/android.view.View[1]/android.view.View[1]")).click();
Set<String> contextNames = driver.getContextHandles();
for (String contextName : contextNames) {
logger.info("contextName = " + contextName);
if (contextName.contains("WEBVIEW")) {
driver.context(contextName);
}
}
WaitTool.waitForVisible(driver, By.xpath("//*[@id=\"go\"]"), 15);
driver.findElement(By.xpath("//*[@id=\"u\"]")).clear();
driver.findElement(By.xpath("//*[@id=\"u\"]")).sendKeys("xxxx");
driver.findElement(By.xpath("//*[@id=\"p\"]")).sendKeys("xxxx");
driver.findElement(By.xpath("//*[@id=\"go\"]")).click();
WaitTool.changeWindow(driver, By.cssSelector("#app > div > div.am-wingblank.am-wingblank-lg > div > div.status-text"), 15);
boolean flag = false;
while (true) {
WebElement waitElement = driver.findElement(By.cssSelector("#app > div > div.am-wingblank.am-wingblank-lg > div > div.status-text"));
switch (waitElement.getText()) {
case "导入成功!":
flag = true;
logger.info(waitElement.getText());
break;
case "导入失败!":
flag = true;
logger.info(waitElement.getText());
break;
default:
logger.info(waitElement.getText());
Thread.sleep(3000);
driver.manage().timeouts().implicitlyWait(2, SECONDS);
}
if (flag){
break;
}
}
}
4、多个h5时,切换处理如下:
public static void change(AppiumDriver driver){
int a = driver.getWindowHandles().toArray().length;
logger.debug("a = " + a);
driver.switchTo().window((String) driver.getWindowHandles().toArray()[a-1]);
try {
logger.info("url = " + driver.getCurrentUrl());
}catch (Exception e){
try {
Alert alert = driver.switchTo().alert();
alert.accept();
}catch (Exception e1){
e1.printStackTrace();
}
}
}
以ios为例
1、读取元素
https://github.com/mykola-mokhnach/Appium-iOS-Inspector
(1) clone或者下载解压包后,打开目录中的iOS Inspector.html
(2) debug工程
(3) 刷新打开了的iOS Inspector.html
(4) 就有结果了。。。
2、准备.app文件
3、运行demo工程
@Test
public void test() throws InterruptedException {System.out.println("test begin");
// 选择环境
driver.findElementByIosNsPredicate("type == 'XCUIElementTypeButton' and label == '请选择环境'").click();
driver.findElementByIosNsPredicate("type == 'XCUIElementTypeButton' and label == '测试环境'").click();
driver.findElementByIosNsPredicate("type == 'XCUIElementTypeButton' and label == '点击测试'").click();
WaitTool.waitForVisible(driver, MobileBy.iOSNsPredicateString("label contains '已阅读'"),10);
List<IOSElement> list_mail = driver.findElementsByIosNsPredicate("type == 'XCUIElementTypeImage'");
list_mail.get(2).click();
WaitTool.waitForVisible(driver, MobileBy.iOSNsPredicateString("type == 'XCUIElementTypeSecureTextField'"),10);
List<IOSElement> list_login_username = driver.findElementsByIosNsPredicate("type == 'XCUIElementTypeTextField'");
List<IOSElement> list_login_password = driver.findElementsByIosNsPredicate("type == 'XCUIElementTypeSecureTextField'");
list_login_username.get(0).sendKeys("xxxx");
list_login_password.get(0).sendKeys("xxxxx");
driver.findElementByIosNsPredicate("type == 'XCUIElementTypeButton' and label == '登录'").click();
WaitTool.waitForVisible(driver, MobileBy.iOSNsPredicateString("type == 'XCUIElementTypeStaticText'"),10);
boolean flag = false;
while (true) {
List<IOSElement> waitElements = driver.findElementsByIosNsPredicate("type == 'XCUIElementTypeStaticText'");
if (waitElements.size() > 1 ) {
flag = run(waitElements.get(2));
}else {
flag = run(waitElements.get(0));
}
if (flag){
break;
}
}