Appium 微信 webview 的自動化技術(轉載)
最近好多人問微信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自動化方法的人