appium常见问题
appium常见问题
APP每次启动都会初始化
启动APP时设置DesiredCapabilities属性:noRest
public class Driver {
private static AndroidDriver driver;
public static void start(){
DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
desiredCapabilities.setCapability("deviceName", "926QADV72277E");
//desiredCapabilities.setCapability("deviceName", "192.168.71.101:5555");
//desiredCapabilities.setCapability("deviceName", "192.168.242.105:5555");
desiredCapabilities.setCapability("platformName", "Android");
desiredCapabilities.setCapability("appPackage", "com.DaTong.InsuranceForAndroid");
desiredCapabilities.setCapability("appActivity", ".StartActivity");
//noRest:不重置,true、false
desiredCapabilities.setCapability("noReset", true);
URL remoteUrl = null;
try {
remoteUrl = new URL("http://localhost:4723/wd/hub");
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
启动app自动授权
启动APP时设置DesiredCapabilities属性:autoGrantPermissions
安卓解决方法:
public class Driver {
private static AndroidDriver driver;
public static void start(){
DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
desiredCapabilities.setCapability("deviceName", "926QADV72277E");
//desiredCapabilities.setCapability("deviceName", "192.168.71.101:5555");
//desiredCapabilities.setCapability("deviceName", "192.168.242.105:5555");
desiredCapabilities.setCapability("platformName", "Android");
desiredCapabilities.setCapability("appPackage", "com.DaTong.InsuranceForAndroid");
desiredCapabilities.setCapability("appActivity", ".StartActivity");
//autoGrantPermissions:自动检查需要哪些权限并给予,当设置属性noRest为true时不起作用,值:true、false
desiredCapabilities.setCapability("autoGrantPermissions", true);
URL remoteUrl = null;
try {
remoteUrl = new URL("http://localhost:4723/wd/hub");
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
无法根据id、text完成定位时的定位方法
-
根据属性,
- 例如查找密码输入框:根据密码属性框
By passwordlogin=By.xpath("//*[@password='true']");- 例如输入一定字数后可点击:根据是否可点击
By passwordlogin=By.xpath("//*[@clickable='true']");- 例如输入一定字数后可使用:根据是否可使用
By passwordlogin=By.xpath("//*[@enable='true']"); -
根据文字模糊匹配
By search_wamgxiao = locate("//div[contains(text(),'网销')]"); -
多属性定位
By searchall = locate("//div[@class='swiper-slide swiper-slide-active']//div[@class='new-product-block border-bottom-line-gray'][not(contains(@style,'display: none;'))]/div[@class='title']");- 当使用多个属性时:
By.xapth("/div[@class='inter'][@name='dsw']")
获取元素属性
使用getAttribute()获取:
Driver.getCurrentDriver().findElement(By.xpath("//*[@text='123']")).getAttribute("id");
当页面布局根据内容变更时,怎么定位元素
- 循环打印元素位置:getlocation,直至不变更后再使用该元素
等待
- 隐式等待:
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
- 显示等待:
WebDriverWait wait = new WebDriverWait(Driver.getCurrentDriver(),10);
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@text='咨询']"))).click();
横竖屏切换、后退
//切换横屏
static void change_transverse(){Driver.getCurrentDriver().rotate(ScreenOrientation.LANDSCAPE);}
//切换竖屏
static void change_vertical(){Driver.getCurrentDriver().rotate(ScreenOrientation.PORTRAIT);}
//后退
Driver.getCurrentDriver().navigate().back();
xpath定位方法简介
//相对定位,1、全部元素
xpath='//*'
//2、指定属性内容
xpath="//*[@text='任务中心']"
//3、包含属性内容,查找class属性中包含image的APP控件
xpath="//*[contains(@class,'image')]"
//4、多条件同时满足筛选控件
xpath="//*[contains(@class,'image') and contains(@enable,'ture') ]"
//5、多条件,其中一条满足筛选控件
xpath="//*[contains(@class,'image') or contains(@enable,'ture') ]"
//6、ancestor,父类条件筛选
//查找class属性中包含image的APP控件且父辈为可见的
xpath="//*[contains(@class,'image')]/ancestor::*// [contains(@enable,'ture') ]"
//7、运算:选取价格高于 35 的所有 price 节点
xpath="/bookstore/book[price>35]/price"
截图
static void screen(String name) throws IOException {
FileUtils.copyFile(Driver.getCurrentDriver().getScreenshotAs(OutputType.FILE).getCanonicalFile() , new File(name+".png"));
}
定位toast
- 需要使用UiAutomator2
- pagesoure内是没有的
String massageFail = "//*[@class='android.widget.Toast']";
find_toast(massageFail).getText();
static WebElement find_toast(String locator){
//获取toast提示框
return new WebDriverWait(Driver.getCurrentDriver(), 30).until(new ExpectedCondition<WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(locate(locator));
}
});
}
appium运行原理

详细解析:
打印appium log
- appium –g-timestamp 终端打印log时 打印时间戳
- appium –g-timestamp appium.log 打印到本地
查看更多详细问题(嗅探、转发)
-
嗅探:tcpdump
- sudo tcodump -i any port 4723-4724 -w /temp/tcp.dump
-
转发:em-proxy、nc
- gem install em-proxy
- em-proxy -l 5723 -r 127.0.0.1:4723 -v
-
以上仅是mac方法,windows直接使用tcpdump.
webview测试方法
- 混合的页面借助原生方法直接使用
Driver.getCurrentDriver().findElementsByAccessibilityId("立即开始").click();
-
纯H5页面
- 需要有对应的chromedriver(https://chromedriver.storage.googleapis.com/index.html)
- chromedriver设置(http://appium.io/docs/en/writing-running-appium/web/chromedriver/)
- contexts机制
- 默认都是NATIVE_APP
- 所有的webview context都是WEBVIEW_进程名
//获取全部上下文 Driver.getCurrentDriver().getContextHandles(); //切换上下文 Driver.getCurrentDriver().context("WEBVIEW_com.DaTong.InsuranceForAndroid");
手势操作
- press
press按下:某一点或某一元素:坐标: (x=500,y=500)
TouchAction(driver).press(x=500,y=500).perform();
press(x=500,y=500).release();//相当于一次tap():
TouchAction(driver).press(x=500,y=500).release().perform();
press(x=500,y=500).wait(5000).release();//相当于一次长按:
TouchAction(driver).press(x=500,y=500).wait(5000).release().perform();
- moveTo
//移动
ta.press(PointOption.point(a)).moveTo(PointOption.point(b)).release().perform();
- release
//松开press
- perform
//每个动作需要这个函数才能执行
- tap wait
//轻敲
ele=driver.find_element_by_id("android:id/title");
TouchAction(driver).tap(ele).perform();
- longPress
//长按
long_press(element,x,y,duration);
TouchAction(driver).long_press(x=500,y=500).perform();
- cancel
//取消
TouchAction(driver).cancel();
- 多点触控:
action0 = TouchAction().tap(el);
action1 = TouchAction().tap(el);
MultiAction().add(action0).add(action1).perform();
处理随时弹窗
- 改造UIautomatior2.server支持事件监听
- 封装查找空间方法,增加错误处理
static WebElement find(By locator){
//查找元素功能
try {
return Driver.getCurrentDriver().findElement(locator);
}catch (Exception e){
//这里是处理可能出现的弹窗,所有的弹框
Driver.getCurrentDriver().findElement(locate_text("我知道了")).click();
return Driver.getCurrentDriver().findElement(locator);
}
}

浙公网安备 33010602011771号