51Testing软件测试论坛

标题: Appium 微信 webview 的自动化技术 [打印本页]

作者: lsekfe    时间: 2017-1-16 16:31
标题: Appium 微信 webview 的自动化技术
文章出处:https://testerhome.com/topics/6954
用微信打开debugx5.qq.com, 这是个微信的x5内核调试页面. 你可以在任何聊天窗口内输入这个网址. 并打开它.
勾选"是否打开TBS内核Inspector调试功能"



使用ChromeDriver编写测试用例
首先安装ChromeDriver
从官方下载或者从你的appium的安装路径里面找chromedriver. 在appium的执行日志里面其实也会打印chromedriver的路径的
然后在电脑上启动它, 设置好端口
  1. chromedriver --url-base=wd/hub --port=8000
复制代码
可以使用selenium或者appium的客户端去编写测试用例.
如下是我的scalatest的测试用例. 大家可以自己用其他的语言实现
  1. test("test chromedriver weixin") {
  2.   val options = new ChromeOptions()
  3.   options.setExperimentalOption("androidPackage", "com.tencent.mm")
  4.   options.setExperimentalOption("androidUseRunningApp", true)
  5.   options.setExperimentalOption("androidActivity", ".plugin.webview.ui.tools.WebViewUI")
  6.   options.setExperimentalOption("androidProcess", "com.tencent.mm:tools")
  7.   val capability = DesiredCapabilities.chrome()
  8.   capability.setCapability(ChromeOptions.CAPABILITY, options)
  9.   val url = "http://127.0.0.1:8000/wd/hub"
  10.   val driver = new AndroidDriver[WebElement](new URL(url), capability)
  11.   driver.get("https://testerhome.com/topics/6954")
  12.   println(driver.getPageSource)
  13.   driver.quit()
  14. }
复制代码
使用appium编写测试用例
有人会经常问为什么android上appium不能自动化微信webview, 其实是可以的. 主要是目前的appium有个bug导致的.
在appium中context的切换时, 没有带上一个关键的androidProcess配置导致的.
他会导致appium识别webview的时候, 把com.tencent.mm:tools的webview识别成com.tencent.mm的webview. 从而导致context切换失败.
正确的用appium测试微信h5的方法如下
  1. test("test weixin h5") {
  2.   val capability = new DesiredCapabilities()
  3.   capability.setCapability("app", "")
  4.   capability.setCapability("appPackage", "com.tencent.mm")
  5.   capability.setCapability("appActivity", ".ui.LauncherUI")
  6.   capability.setCapability("deviceName", "emulator-5554")
  7.   capability.setCapability("fastReset", "false")
  8.   capability.setCapability("fullReset", "false")
  9.   capability.setCapability("noReset", "true")
  10.   //capability.setCapability("unicodeKeyboard", "true")
  11.   //capability.setCapability("resetKeyboard", "true")

  12.   //关键是加上这段
  13.   val options = new ChromeOptions()
  14.   options.setExperimentalOption("androidProcess", "com.tencent.mm:tools")
  15.   capability.setCapability(ChromeOptions.CAPABILITY, options)

  16.   val url = "http://127.0.0.1:4723/wd/hub"
  17.   val driver = new AndroidDriver[WebElement](new URL(url), capability)
  18.   println(driver.getPageSource)
  19.   driver.findElementByXPath("//*[@text='我']").click
  20.   driver.findElementByXPath("//*[@text='收藏']").click
  21.   driver.findElementByXPath("//*[contains(@text, '美团外卖')]").click
  22.   println(driver.getPageSource)
  23.   println(driver.getContextHandles)
  24.   driver.context("WEBVIEW_com.tencent.mm:tools")
  25.   println(driver.getPageSource)
  26. }
复制代码
最关键的就是这句
  1. val options = new ChromeOptions()
  2. options.setExperimentalOption("androidProcess", "com.tencent.mm:tools")
  3. capability.setCapability(ChromeOptions.CAPABILITY, options)
复制代码
后记
之前测试加上ChromeOptions配置的时候没有成功, 我以为是appium不支持ChromeOptions, 就给appium-android-driver提交了一个PR
后来jlipps提醒了我一下



我就又追查了几遍, 最后发现是我本地安装appium时候加上的http_proxy环境变量干扰了ChromeDriver的执行.
Appium其实是支持ChromeOptions的
结论也就是现在的Appium其实是可以完美的做微信自动化的
我在想我是不是国内第一个提供微信webview自动化方法的人


作者: M_leon    时间: 2017-3-6 09:41
学习了,感谢楼主




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2