一、如何判断是否是混合app呢?
打开uiautomatorviewer.bat进行查看,在框住的元素都定位不到,只能定位大框,且旁边显示的是webView,那这个页面就是混合页面,所以这个app为混合app;这种app有原生app还有h5页面,或者说单纯的就套了一个安卓的壳子,里面其实全部是h5;
二、如何查看混合界面的元素?
1. 需要在源码中打开应用的webviewdebug
2. 在谷歌浏览器中 输入: chrome://inspect 即可看到已连接的手机,如果已经打开含有h5的app则显示下面图示,观察图示可看到报名,手机信息,点inspect可进入查看html信息;如果是真机,可能还会把屏幕投在这里;
3. 定位视图:inspect——点搜索框——》点模拟器上的元素,高亮显示的就是定位的元素
三、如何定位元素:
1、xpath 定位
driver.findElement(By.xpath("//a[@title='蜗牛泉的自动化测试练习']")).click();
2、id 定位
driver.findElement(By.id("carousel-recommendation")).click();
3、linkText 定位
driver.findElement(By.linkText("appium -doctor报错")).click();
4、通过css的id属性定位(#id值)——》id选择器
//定位属性id为carousel-recommendation的这个元素
driver.findElement(By.cssSelector("#carousel-recommendation")).click();
5、通过css的class属性定位(. class值)——》类选择器
driver.findElement(By.cssSelector(".carousel slide")).click();
6、通过其他属性定位,如下面a标签的href属性进行定位
driver.findElement(By.cssSelector("a[href='http://ask.testfan.cn/question/866']")).click();
四、遇到的问题(用途:需要测试的apk不是自公司的)
在使用路径安装的driver时,有可能会把这个app强制转换成原生的,这种情况下可使用原生对的进行定位,观察图示发现使用content-desc定位最为方便,缺点是:不稳定
package com.appium.zhihu;
import java.util.Set;
import org.openqa.selenium.By;
import io.appium.java_client.MobileBy.ByAccessibilityId;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
public class HybridTest {
/**
* 如果driver在webview driver下是是不可以使用滑动的;若要使用必须切换context;不可使用关键字自动切换,因为若有多个的情况下不知道切换到那个上了
* @param driver
*/
public static void askTest(AndroidDriver<AndroidElement> driver){
//切换context,安卓原生一个,混合界面一个;
String current_context=driver.getContext();//获取当前界面的context
System.out.println("current_context ——》"+current_context);
//获取所有的context
Set<String> contexts=driver.getContextHandles();
for(String context:contexts){
System.out.println("context——》"+context);
if(context.contains("WEBVIEW_com.testfan.ask")){
driver.context(context);//切换
break;
}
}
//切换后可定位元素,不在当前屏需要滑动下的也可以点中(和html加载有关)
//driver.findElement(By.xpath("//a[@title='如何实现代码高亮?']")).click();或者使用两种定位方式
driver.findElement(By.linkText("如何实现代码高亮?")).click();
driver.findElement(By.id("carousel-recommendation")).click();//通过id定位
//以下是使用的webdriver的定位方式
driver.findElement(By.cssSelector("#carousel-recommendation")).click();//通过id属性定位(#)
driver.findElement(By.cssSelector(".carousel slide")).click();//通过class定位(.)
//表示通过a标签的href定位
driver.findElement(By.cssSelector("a[href='http://ask.testfan.cn/question/866']")).click();
//切换为原生context
//driver.context("NATIVE_APP");//切换成原生的context即可使用滑动手势等操作
}
}