大家从头看完配置,不一定你的问题在webview配置,有可能出现在了驱动,还有一个重要的点,手机不需要下载谷歌浏览器,只是需要配置appium的chromedriver驱动版本和Android System WebView的版本一致就可以(网上有很多案例都说需要安装谷歌浏览器,亲测无效会报错误:
io.appium.java_client.NoSuchContextException: An unknown server-side error occurred while processing the command. Original error:
)
混合(hybrid)和原生(native)App
什么是混合app,其实这个不言而喻,我们的app正常来说应该都是原生(native)的,但是实际工作中却不是,反正种种原因我们的app会有native的而且中间还会有H5页面,这其实就是我们常说的混合,当然还有一种就是纯H5的,但是这里我们不做过多的讲解。
WebView元素定位工具
- 使用driver.page_source方法,将获取到的页面内容写入到一个html文件中,然后使用浏览器打开html文件,使用F12调试用具进行元素定位(代码层面)
- chrome浏览器自带的调试工具 Developer Tools,在chrome浏览器中输入:chrome://inspect#devices,该工具需要访问国外的网站,因此需要翻墙
- 使用UC开发者调试工具,需要提前安装,无需翻墙(工具:UC-devtools)官网地址:https://dev.ucweb.com/docs/pwa/docs-zh/xy3whu
建议大家使用UC-devtools,去官网下载好之后需要简单设置下就可以使用;使用的时候需要手机使用 usb 链接手机;在Home页面查看
准备工作
第一步打开手机设置找到应用管理
这个是国内chromedriver驱动下载地址:http://npm.taobao.org/mirrors/chromedriver/
跟据手机应用管理设置里面获取到的版本号下载对应的驱动,这里示例的版本号是(79.0.3945)对应的驱动如下图:
点击下载压缩包如下:
下载下来的压缩包解压到自定义的文件目录下,没有必要去更换appium自带的chromedriver驱动;(记住自己下载的驱动目录只,之后需要配置);
Java appium webview 自动化测试配置
话不多说直接上代码:
/**
* @Author HLY
* @Create 2020-03-23 17:41
*/
public class TTest {
AndroidDriver driver;
@Before
public void befor(){
DesiredCapabilities capabilities = new DesiredCapabilities();
//appium的版本
capabilities.setCapability(MobileCapabilityType.APPIUM_VERSION, "v1.8.1");
//android系统的版本
capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "android_version_xx");
//系统
capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
//驱动
capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, "UiAutomator2");//UiAutomator1和UiAutomator2使用区别在于版本限制,V1.14.0以上的版本建议使用UiAutomator1
capabilities.setCapability(MobileCapabilityType.UDID, "deviceName_xx");
//设备名称 模拟器名称
capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "deviceName_xx");
//capabilities.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());
//设置app的包名
capabilities.setCapability("appPackage", "com.xx.xx");
//设置app的启动activity
capabilities.setCapability("appActivity", ".xxActivity");
//capabilities.setCapability("newCommandTimeout", 2000);x
//此处的地址是appium中的host地址,可以自己修改,只要与appium对应就可以
capabilities.setCapability("noReset", true);
//支持中文输入
capabilities.setCapability("unicodeKeyboard", true);
//重置输入法到原有状态
capabilities.setCapability("resetKeyboard", true);
//设置你下在的 chromedriver驱动路径,路径只写到ChromeDriver.exe的上层目录
capabilities.setCapability("chromedriverExecutableDir","D:\\xx\\ChromeDriver\\chromedriver_win79.0.3945.36");
try {
this.driver = new AndroidDriver<AndroidElement>(new URL("http://127.0.0.1: 4723/wd/hub"), capabilities);
} catch (MalformedURLException e) {
e.printStackTrace();
}
TouchAction touchAction =new TouchAction(driver);
}
/**
* @throws InterruptedException
*/
@Test
public void test() throws InterruptedException, IOException {
//TODO 你的原生app自动化逻辑
...
...
...
//TODO 切换到 webview 前提条件是当前页面必须是webview
//这里才会获取到上下文呢信息,
Set<String> contextNames = driver.getContextHandles();
for (String contextName : contextNames) {
System.out.println(contextName); //prints out something like NATIVE_APP \n WEBVIEW_1
}
//WebDriver webDriver = driver.switchTo().window((String) contextNames.toArray()[1]);
driver.context((String) contextNames.toArray()[1]);// set context to WEBVIEW_1
driver.findElement(By.xpath("//*[@id=\"btn\"]")).click();
Thread.sleep(10000);
//切换回原生
driver.context((String) contextNames.toArray()[0]);
System.out.println("WebView自动化测试完成");
}
@After
public void after(){
driver.quit();
}
}
还要启动appium 服务,这里就可以执行用例,亲测有效,有不懂的小伙伴可以留言或者私信,本人看到后会第一时间回复大家