干貨|app自動(dòng)化測(cè)試之Andriod WebView如何測(cè)試
Hybrid App(混合模式移動(dòng)應(yīng)用)是介于 Web-app、Native-app 之間的 app,本質(zhì)上是 Native-app 中嵌入 WebView 組件,在 WebView 組件里可以訪問(wèn) Web App。Hybrid App 在給用戶良好交互體驗(yàn)的同時(shí),還具備了 Web App 的跨平臺(tái)、熱更新機(jī)制等優(yōu)勢(shì)。
Android WebView 在 Android 平臺(tái)上是一個(gè)特殊的 View,用它來(lái)展示網(wǎng)頁(yè)內(nèi)容。WebView 內(nèi)部實(shí)現(xiàn)是采用渲染引擎來(lái)展示 View 的內(nèi)容,提供網(wǎng)頁(yè)前進(jìn)后退、網(wǎng)頁(yè)放大、縮小、搜索等功能。使用 WebView 進(jìn)行測(cè)試需要開(kāi)發(fā)人員配合打開(kāi)一個(gè) WebView 的開(kāi)關(guān)。
WebView開(kāi)關(guān)
WebView 是手機(jī)應(yīng)用內(nèi)嵌的瀏覽器,在 Android 4.4 之前 WebView 內(nèi)核采用的是 WebKit,Android 4.4 之后才用的是 Chrome 作為內(nèi)置瀏覽器。它是用來(lái)加載 HTML 頁(yè)面的控件。在模擬器(android6.0 版本)中是默認(rèn)打開(kāi) WebView 開(kāi)關(guān)的,可以直接調(diào)試和測(cè)試 WebView。真機(jī)測(cè)試時(shí),必須在應(yīng)用中打開(kāi) WebView 調(diào)試開(kāi)關(guān)。要啟用 WebView 調(diào)試,請(qǐng)?jiān)?WebView 類(lèi)上調(diào)用靜態(tài)方法 setWebContentsDebuggingEnabled。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
?
?if (0 != (getApplicationInfo().flags &\
? ? ApplicationInfo.FLAG_DEBUGGABLE))
? ?{ WebView.setWebContentsDebuggingEnabled(true); }?
}
開(kāi)啟這個(gè)開(kāi)關(guān)之后,手機(jī)端打開(kāi)被測(cè)的 WebView 頁(yè)面,然后在電腦端 Chrome 瀏覽器地址欄錄入 “chrome://inspect” 將顯示設(shè)備上的 WebView 列表。
點(diǎn)擊想要調(diào)試的 WebView 下方的 inspect 鏈接,就可以查看這個(gè)頁(yè)面的源代碼了。通過(guò)源代碼就可以查看并確定元素定位表達(dá)式了。

如果遇到 Chrome 瀏覽器版本和 Chromedriver 版本不匹配的問(wèn)題,可以參見(jiàn):
chromedriver下載地址與webview自動(dòng)化關(guān)鍵代碼
注意:測(cè)試開(kāi)發(fā)寶典中提及的觸屏操作自動(dòng)化鏈接改為:Appium-touch-actions?,請(qǐng)有意向者移步該帖進(jìn)行瀏覽 chromedriver的介紹與相關(guān)資料地址,方便自動(dòng)化測(cè)試工程師查閱 錯(cuò)誤提示 未安裝chromedriver No Chromedriver found that can automate Chrome ‘76.0.3809’. You could als…
WebView 測(cè)試
切換到 WebView 頁(yè)面,就可以使用 Selenium 操作元素。
driver.switch_to.context 方法可以從原生頁(yè)面切換到 WebView 頁(yè)面,示例代碼如下:
webview = driver.contexts[-1]?
driver.switch_to.context(webview)
WebView 案例
雪球案例,打開(kāi)雪球應(yīng)用,點(diǎn)擊“交易”,點(diǎn)擊“A 股開(kāi)戶”進(jìn)入到開(kāi)戶頁(yè),驗(yàn)證頁(yè)面正確。如下圖:
def test_webview(self):
??
? ? ?# 點(diǎn)擊交易
? ? ?
?self.driver.find_element(MobileBy.XPATH, '//*[@text="交易"]').click()
? ? ? ?# 打印當(dāng)前頁(yè)面有哪些上下文?
? ? ? ?print(self.driver.contexts)
? ??
? ?e = self.driver.contexts
??
? ? ?for context in self.driver.contexts[::-1]:
? ? ??
? ? ?if 'webview' in context.lower():
? ? ? ??
? ? ? ?aim = context
? ? ? ?
? ? ? ?break
? ?
? ?# 切換上下文
? ? ??
?self.driver.switch_to.context(aim)
? ? ?
??# 點(diǎn)擊'A股開(kāi)戶'
? ??
? ?print(self.driver.window_handles)
? ??
? ?A_locator = (MobileBy.XPATH, '//*[@id="Layout_app_3V4"]/div/div/ul/li[1]/div[2]/h1')
? ? ? ?WebDriverWait(self.driver, 10).until(expected_conditions.element_to_be_clickable(A_locator))
進(jìn)入到 APP 后,打開(kāi)一個(gè)包含 H5 的頁(yè)面,系統(tǒng)默認(rèn)是 Native 的上下文。如果要操作 H5 上的元素,則需要切換到 WEBVIEW 的上下文。
上面的代碼先通過(guò) driver.contexts 找到所有的 contexts(即上下文),循環(huán)遍歷這個(gè)contexts,找到目標(biāo)的 WEBVIEW,然后切換到這個(gè) WEBVIEW 中,再執(zhí)行相應(yīng)的操作。這時(shí)就可以使用 Selenium 的定位方式到 H5 頁(yè)面的元素了。