如何測試帶有webview的Android Hybrid App
你一定曾遇過用uiautomation viewer查找頁面結構時
遇到webview就像遇到柏林圍牆不知道怎麼繼續做下去
來試試看怎麼突破吧~
環境準備
- Webview HTML5 test Android Apk (或任何帶有webivew的App)
- 電腦上安裝Chrome browser
- Android 6.0 模擬器
找到Webview下的元件路徑
谷哥大神有教我們可以用Chrome inspector來Remote Debugging Webviews我們就來給它照著做下去試試看
- 先在模擬器上面打開你要檢查的webview頁面
- 打開電腦上的Chrome, 在網址列輸入 chrome://inspect
- Chrome inspector會偵測目前有哪些已經連接的remote device
並且列出每個device上面有哪些webview被開啟中
- 按下Inspect, 會氣到彈出來 >
Chrome Developer tools
- 有時候左邊的preview畫面會太小,可以按兩次上方的device button重新調整畫面
- 要怎麼找到元件的路徑呢?
各位看到這裡那種熟悉的感覺是不是又回來了
- 先點上方的search button
- 接著移動到想要找的元件上面
- 右邊會自動帶到對應的Element Tree Layer
- 到這裡就能用Selenium常用的Locator來定義元件的位置, ex. Id, Classname, Xpath
也可以按右鍵Copy CSS or Xpath來快速取得路徑
使用Appium操控Webview
知道怎麼樣定位Webview裡面的路徑那接下來就是把路徑放到appium script的工作了
- Desired Capability設定跟Native app一樣
'platformName': 'Android',}
'platformVersion': '6.0',
'deviceName': 'emulator-5554',
'noReset': 'true',
'autoAcceptAlerts': 'true',
'command-timeout': '60',
'app': '../WebView_HTML5_Test_v1.0.apk'
- 先確定要測試頁面裡有沒有包含
Webview
context
contexts = driver.contexts
Webview的名稱會長得像這樣
print(contexts)
- 用switch_to.context切換不同context
一種比較簡單的方式切是指定contexts的最後一筆
driver.switch_to.context("WEBVIEW_com.wt.webviewhtml5test")
萬事俱備,只欠東風.... 嗎
好Der, 讓我們趕快跑一下看看效果如何哎呦! Orz.. 居然出現錯誤
selenium.common.exceptions.WebDriverException: Message: An unknown這是什麼妖術! 怎麼會出現這樣的訊息?
server-side error occurred while processing the command.Original error: Failed to start Chromedriver session: A new session could not be created. (Original error: session not created exception: Chrome version must be >= 60.0.3112.0 (Driver info: chromedriver=2.33.506106...
簡單來說原因是webview元件依賴Android內Chrome核心版本去驅動
每個Chrome核心各自需要不同的chromedriver版本支援
這個錯誤訊息就是提示你目前使用的chromedriver和Chrome不相容
那要怎麼知道現在的webview是用哪個Chrome核心版本呢
最快的方式是打開
Chrome inspector
去檢查這裡可以看到目前的Chrome版本是44.0.2403
對照下圖可以看到44可用的chromeDriver是V2.15~2.20
回顧剛剛的錯誤訊息, appium內建的chrome driver是2.33只支持v60-62 難怪會出現錯誤
解決方式
其中一種解決方式是去下載舊版的chromedriver, 並指定appium去使用- 到Google 官方提供的舊版chromedriver下載舊版(2.15)的chromedriver
https://chromedriver.storage.googleapis.com/index.html
- 解壓縮放到指定資料夾
- 加上參數指定Appium server啟動時使用特定的chrome driver
讓我們重新再執行一次測試腳本,終於能順利的切換到webview了--chromedriver-executable /.../chromeDriver/2.15/chromedriver
執行過程中可以用current context確認目前是使用哪個view
current_context = driver.current_context
切換到webview後我們就可以用selenium的方式來找到web element做各種操作
最後記得別忘了要回家
通常有許多返回按鈕都會放在default view上面最後要離開前記得要切回原來的Native_app view喔
可以用下面這兩種方式來達成
driver.switch_to.context(None)或
driver.switch_to.context(contexts[0])
Comments
Post a Comment