(简单记录,有不正确的地方请指出) 现在我们根据已搭建好的环境进行编写一个实际例子,需要用usb线连接手机,并且手机必须开启开发者模式,允许调试
数据准备
测试app:ContactManager.apk(百度一般都有)
所需的jar包:java-client-4.1.2.jar、selenium-server-standalone-3.4.0.jar、selenium-java-3.4.0.jar、selenium-server-3.4.0.jar
创建好之后的结构图
一、appium启动
二、整个代码以及注释
public class ContactsTest {
//private AppiumDriver driver;
private AndroidDriver driver;
public void setUp() {
try {
File classpathRoot = new File(System.getProperty("user.dir"));
//创建路径为classpathRoot+/apps的file对象
File appDir = new File(classpathRoot, "/apps");
//创建路径为appDir路径+文件的的file对象
File app = new File(appDir, "ContactManager.apk");
//创建DesiredCapabilities对象,存放相关信息
DesiredCapabilities capabilities = new DesiredCapabilities();
//添加设备名参数和参数值BEK7WKGEJ77DJFMN pp36811707001925
capabilities.setCapability("deviceName","8fcccad");
//指定安卓版本
capabilities.setCapability("platformVersion", "6.0");
//添加app参数名和file对象全路径
capabilities.setCapability("app", app.getAbsolutePath());
capabilities.setCapability("appPackage", "com.example.android.contactmanager");
capabilities.setCapability("appActivity", ".ContactManager");
//创建AndroidDriver对象,具体连向地址为http://127.0.0.1:4723/wd/hub
driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
System.out.println("App is launched!");
WebElement el = driver.findElement(By.className("android.widget.Button"));
el.click();
List<WebElement> textFieldsList = driver.findElementsByClassName("android.widget.EditText");
textFieldsList.get(0).sendKeys("Some Name");
textFieldsList.get(2).sendKeys("Some@example.com");
//driver.swipe(100, 500, 100, 100, 2);
driver.findElementByName("Save").click();
System.out.println("App is done!");
driver.quit();
}catch(Exception e) {
driver.quit();
}
}
public static void main(String []args) {
ContactsTest ct=new ContactsTest();
ct.setUp();
}
}
另外把截图放出
三、代码内容解释
在创建连接的时候,可以用不同的代码实现,我这里是从文件中读取apk文件,也可以用直接启动app的方法,可以自己摸索
大部分代码基本都是一样,不用单独说明,只需要注意下面代码
1.设备编号
capabilities.setCapability("deviceName","8fcccad");
通过cmd,输入adb devices进行查看,替换setCapability方法内的第二个参数即可
2.apk文件的appPackage、appActivity参数
capabilities.setCapability("appPackage", "com.example.android.contactmanager");
capabilities.setCapability("appActivity", ".ContactManager");
这两个参数也可以通过adb命令查看,具体的百度一下。如果用ContactManager.apk使用上面的两个参数值没有问题,如果要用其他apk则需要替换
3.获取按钮
WebElement el = driver.findElement(By.className("android.widget.Button"));
el.click();
WebElement :表示类对象
el :表示创建的对象名
driver:开始创建的AndroidDriver对象(这里也可以使用AppiumDriver,详细区别百度)
By.className:表示根据控件的class名称来获取(可以通过class、name等)
“android.widget.Button”:表示控件的属性值
el.click():表示执行点击事件
4.集合,获取多个控件
List<WebElement> textFieldsList = driver.findElementsByClassName("android.widget.EditText");
表示创建一个类型为WebElement的集合,也是根据控件的class名称来获取
5.使用集合内的元素
textFieldsList.get(0).sendKeys("Some Name");
从对象取出元素然后使用各种事件(文本框就输入、按钮就点击事件)
sendKeys("Some Name"):方法表示给对象设置值,值的内容就是方法内传入的参数值
6.使用main方法调用
创建类对象,通过类对象调用自定义的方法
注意:
1.在有些页面进入的时候,有加载时间,如果过早获取控件对象就会找不到控件,从而报空指针异常,需要设置睡眠时间等待页面加载完成(按钮反应时间类似)
2.
五、错误整理
1.info: [debug] Error: Could not extract PIDs from ps output. PIDS: [], Procs: ["bad pid 'uiautomator'"]
解决方法
找到Appium\node_modules\appium\node_modules\appium-adb\lib\adb.js文件,并修改如下:
找到这行var outlines = stdout.split("\n");
在其下面添加outlines.shift()