- app开发模式分为分为:
- native原生开发的组件
- hybrid混合开发webview的组件
- hybrid混合开发的组件
-
webiview是native原生自带的一个组件,它可以嵌入/渲染一个web(或者直接一个外部html), web中的页面元素类型很多,属性也很多,嵌入的是web/h5/css开发的元素;
-
用常用的页面元素捕捉工具,只能用原生的方式解读页面元素,web的很多不同的组件类型,和复杂的属性,都会丢失,只能解读为native的元素,比较简单,会造成属性丢失,看上去就那么几种类型,都相似,很难区分他们。
-
所以,针对webview中的元素我们用Web的方式去获取页面元素才能完整的解读他们:
- chrome://inspect
- [推荐] edge://inspect
-
firefox about:debugging
Andriod 6的webview 是自动开启的,打开并进入带有webview/hybrid的APP页面,然后利用工具进行页面元素的定位:
- hybrid混合模式的自动化
-
webview下的h5元素用的chrome框架,我们用chromeDriver可以解析相应的组件
-
在自动化启动项中配置chromeDriver
desiredCapabilities.setCapability(“chromedriverExecutableDir”, “/Users/gaigai/Documents/hogwarts/chromedriver/95.0.4638.69”);
desiredCapabilities.setCapability(“chromedriverChromeMappingFile”, “/Users/gaigai/Documents/hogwarts/mapping.json”);
desiredCapabilities.setCapability(“showChromedriverLog”, true); -
app中webview的chromedriver是哪个版本,可以用inspect工具中看出来,你需要下载相应的driver版本
国内的chromedriver下载地址:CNPM Binaries Mirror -
appium可以在获取native原生页面元素时切换至UIautomator框架获取元素, 在webiview元素中切换到chromeDriver获取页面元素
获得当前的上下文 driver.getContextHandles();
切换上下文 driver.context(“WEBVIEW_XXXX”) -
当你的edge://inspect里面能看到多个webview的时候,类似于你的浏览器开启了多个Tab页面,用windowsHandles切换,不切换你就拿不到相应页面的元素
如图,我有两个window
driver.switchTo().window(windowHandles.toArray()[1].toString());
driver.findElement(By.xpath(“//input[@id=‘phone-number’]”)).click();
note: 不同于native和webview切换的contextHandle