最近好多人问微信 webview 自动化的事情, 碰巧我也在追微信 webview 的自动化和性能分析方法.
先发出来一点我的进展给大家参考下. 此方法用于 android 平台, iOS 请自行解决

微信的设置

用微信打开 debugx5.qq.com, 这是个微信的 x5 内核调试页面. 你可以在任何聊天窗口内输入这个网址. 并打开它.
勾选"是否打开 TBS 内核 Inspector 调试功能"

使用 ChromeDriver 编写测试用例

首先安装 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()
}

使用 appium 编写测试用例

有人会经常问为什么 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


↙↙↙阅读原文可查看相关链接,并与作者交流