最近好多人问微信 webview 自动化的事情, 碰巧我也在追微信 webview 的自动化和性能分析方法.
先发出来一点我的进展给大家参考下. 此方法用于 android 平台, iOS 请自行解决
用微信打开 debugx5.qq.com, 这是个微信的 x5 内核调试页面. 你可以在任何聊天窗口内输入这个网址. 并打开它.
勾选"是否打开 TBS 内核 Inspector 调试功能"
首先安装 ChromeDriver
从官方下载或者从你的 appium 的安装路径里面找 chromedriver. 在 appium 的执行日志里面其实也会打印 chromedriver 的路径的
然后在电脑上启动它, 设置好端口
chromedriver --url-base=wd/hub --port=8000
可以使用 selenium 或者 appium 的客户端去编写测试用例.
如下是我的 scalatest 的测试用例. 大家可以自己用其他的语言实现
test("test chromedriver weixin") {
val options = new ChromeOptions()
options.setExperimentalOption("androidPackage", "com.tencent.mm")
options.setExperimentalOption("androidUseRunningApp", true)
options.setExperimentalOption("androidActivity", ".plugin.webview.ui.tools.WebViewUI")
options.setExperimentalOption("androidProcess", "com.tencent.mm:tools")
val capability = DesiredCapabilities.chrome()
capability.setCapability(ChromeOptions.CAPABILITY, options)
val url = "http://127.0.0.1:8000/wd/hub"
val driver = new AndroidDriver[WebElement](new URL(url), capability)
driver.get("https://testerhome.com/topics/6954")
println(driver.getPageSource)
driver.quit()
}
有人会经常问为什么 android 上 appium 不能自动化微信 webview, 其实是可以的. 主要是目前的 appium 有个 bug 导致的.
在 appium 中 context 的切换时, 没有带上一个关键的 androidProcess 配置导致的.
他会导致 appium 识别 webview 的时候, 把 com.tencent.mm:tools 的 webview 识别成 com.tencent.mm 的 webview. 从而导致 context 切换失败.
正确的用 appium 测试微信 h5 的方法如下
test("test weixin h5") {
val capability = new DesiredCapabilities()
capability.setCapability("app", "")
capability.setCapability("appPackage", "com.tencent.mm")
capability.setCapability("appActivity", ".ui.LauncherUI")
capability.setCapability("deviceName", "emulator-5554")
capability.setCapability("fastReset", "false")
capability.setCapability("fullReset", "false")
capability.setCapability("noReset", "true")
//capability.setCapability("unicodeKeyboard", "true")
//capability.setCapability("resetKeyboard", "true")
//关键是加上这段
val options = new ChromeOptions()
options.setExperimentalOption("androidProcess", "com.tencent.mm:tools")
capability.setCapability(ChromeOptions.CAPABILITY, options)
val url = "http://127.0.0.1:4723/wd/hub"
val driver = new AndroidDriver[WebElement](new URL(url), capability)
println(driver.getPageSource)
driver.findElementByXPath("//*[@text='我']").click
driver.findElementByXPath("//*[@text='收藏']").click
driver.findElementByXPath("//*[contains(@text, '美团外卖')]").click
println(driver.getPageSource)
println(driver.getContextHandles)
driver.context("WEBVIEW_com.tencent.mm:tools")
println(driver.getPageSource)
}
最关键的就是这句
val options = new ChromeOptions()
options.setExperimentalOption("androidProcess", "com.tencent.mm:tools")
capability.setCapability(ChromeOptions.CAPABILITY, options)
之前测试加上 ChromeOptions 配置的时候没有成功, 我以为是 appium 不支持 ChromeOptions, 就给 appium-android-driver 提交了一个 PR
后来 jlipps 提醒了我一下
我就又追查了几遍, 最后发现是我本地安装 appium 时候加上的 http_proxy 环境变量干扰了 ChromeDriver 的执行.
Appium 其实是支持 ChromeOptions 的
结论也就是现在的 Appium 其实是可以完美的做微信自动化的
我在想我是不是国内第一个提供微信 webview 自动化方法的人
借鉴此思路的同学转发请注明原链. https://testerhome.com/topics/6954