环境搭建的文章有很多,在此不再多说,我们从使用android模拟器的第一个例子开始
首先先创建一个模拟器,我创建的是版本4.4.2的,因为学习的时候搜索到的大部分都是这个版本的。
7.0版本的是本来打算测试真机的时候用的,但是真机就用不到模拟器了,只要把SDK下载好就可以了,所以这个就不用看了。
然后点击start,打开模拟器,因为打开的速度很慢,耐心的等一会。
然后我们来编写测试用例,我用的是maven+testNG,因为maven导入jar很方便,不用自己去下载jar包,只需要在pom.xml中添加
org.seleniumhq.selenium
selenium-java
LATEST
org.testng
testng
LATEST
org.seleniumhq.selenium
selenium-remote-driver
LATEST
io.appium
java-client
5.0.4
然后保存就可以了,jar包就导入进来了。
package appiumtest;
import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import java.io.File;
import java.net.URL;
import java.util.List;
public class AppDemo {
private AppiumDriver driver;
@BeforeTest
public void setUp() throws Exception {
// set up appium
File classpathRoot = new File(System.getProperty("user.dir"));
System.out.println("Class是=="+classpathRoot);
File appDir = new File(classpathRoot, "apps");
System.out.println("appDir是=="+appDir);
//File app = new File(appDir, "ContactManager.apk");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
capabilities.setCapability("platformName", "Android");
capabilities.setCapability("deviceName","Android Emulator");
capabilities.setCapability("platformVersion", "4.4.2");
//capabilities.setCapability("app", app.getAbsolutePath());
capabilities.setCapability("appPackage", "com.example.android.contactmanager");
capabilities.setCapability("appActivity", ".ContactManager");
driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
}
@AfterTest
public void tearDown() throws Exception {
driver.quit();
}
@Test
public void addContact(){
WebElement el = driver.findElement(By.name("Add Contact"));
el.click();
List textFieldsList = driver.findElementsByClassName("android.widget.EditText");
textFieldsList.get(0).sendKeys("Some Name");
textFieldsList.get(2).sendKeys("Some@example.com");
driver.findElementByName("Save").click();
}
}
这个测试的例子也是我找的例子,其中apk的设置是多余的,因为你只要设置了appPackage与appActivity就可以了。
然后打开Appium,可以通过cmd直接输入appium来打开,启动Appium。
这样就是启动成功了,你就可以运行你的测试案例了。
然后我们来测试一下真机,首先先连接真机,然后在cmd中测试真机是否连接成功
获取你的测试机的ID
获取要测试的app的包名com.android.calculator2和activity的名字/com.android.calculator2.Calculator
然后打开uiautomatorviewer获取元素,主要获取resource-id
然后编写测试案例并运行
package appiumtest;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.AfterClass;
import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;
import java.net.URL;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
public class loginOccall2 {
private AppiumDriver driver;
@BeforeClass
public void setup() throws Exception {
DesiredCapabilities cap = new DesiredCapabilities();
cap.setCapability(CapabilityType.BROWSER_NAME, "");
cap.setCapability("platformName", "Android"); //指定测试平台
cap.setCapability("deviceName", "CSX0217714007262"); //指定测试机的ID,通过adb命令`adb devices`获取
cap.setCapability("platformVersion", "7.0");
//将上面获取到的包名和Activity名设置为值
cap.setCapability("appPackage", "com.android.calculator2");
cap.setCapability("appActivity", ".Calculator");
//A new session could not be created的解决方法
cap.setCapability("appWaitActivity","com.android.calculator2.Calculator");
//每次启动时覆盖session,否则第二次后运行会报错不能新建session
cap.setCapability("sessionOverride", true);
driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), cap);
}
@Test
public void plus(){
//获取1
driver.findElementById("com.android.calculator2:id/digit_1").click();
//获取+
driver.findElementById("com.android.calculator2:id/op_add").click();
//获取2
driver.findElementById("com.android.calculator2:id/digit_2").click();
//获取=
driver.findElementById("com.android.calculator2:id/eq").click();
}
@AfterClass
public void tearDown() throws Exception {
driver.quit();
}
}
我在测试中出现一个错误:Could not extract PIDs from ps output. PIDS: [], Procs: ["bad pid 'uiautomator'"],弄了好半天,最后在一个文章中找到答案,已经解决。解决此问题的文章链接
修改 Appium\node_modules\appium\node_modules\appium-adb\lib\adb.js 文件
this.shell("ps '" + name + "'", function (err, stdout) {
...
var procs = [];
var outlines = stdout.split("\n");
outlines.shift() //添加这行
...
这就是我从小白到了解appium的基本运行方式的一点记录,希望对看到我这篇有点傻瓜教程的朋友有帮助。
借鉴的文章有:
https://www.jianshu.com/p/84aa9383f8fd点击打开链接
http://blog..net/u012106209/article/details/77012141点击打开链接
再次感谢每位博主的无私奉献