移動端 app 自動化架構很多,但是有一些架構因為不支援混合應用測試,一直沒有完全流行。比較典型的是經典的 Python 架構 uiautomator2, 這個架構簡單好用,沒有 appium 那樣複雜的 api 調用,受到不少 python 自動化工程師的青睐。
但是不管是官方文檔,還是民間教程,基本都沒有涉及到用它做混合應用測試,本文提供一種非常簡單的方法,隻需要多加 4 行代碼,就能讓 uiautomator2 支援混合應用測試。
什麼是混合應用
移動端應用有兩種典型的開發方式,一種是原生的 native app,一種是基于網頁開發技術的 web app。 原生應用的體驗感更好,但是如果想同時開發安卓應用和 ios 應用,需要不同的原生開發技術。 web 應用可以非常輕松的做到安卓和 ios 的跨平台開發,它的體驗感要稍微差一些,不像原生應用那麼流暢。
Hybrid App(混合模式移動應用)是介于 web app和native app之間的開發方式,可以在原生界面中嵌套網頁,因而可以同時具備體驗感和跨平台能力。
目前主流的移動端 app 測試架構 appium 具備混合應用測試的能力,但是這個架構搭建和使用都比較麻煩,封裝的方法也沒有那麼 pythonic,是以有很多公司不想使用,他們更加喜歡簡潔優雅的 python uiautomator2 架構。 非常遺憾,這個架構目前沒有支援混合應用測試。
混合應用測試步驟
- 第一步,通過原生操作進入 webview 網頁;
- 第二步,使用 selenium 等網頁測試工具進入網頁;
- 第三步,使用 selenium 等網頁測試工具測試。
這中間的關鍵步驟在于如何使用 selenium, 如果直接打開一個新的 selenium 會話,那麼會打開一個新的頁面,和 app 中的 webview 是分開的,是以無法測到嵌套網頁。 selenium 必須要和 app 建立某種關系,使他們綁定在一起,操作 selenium 時就是直接操作 app 當中的網頁。

通過 uiautomator2 進入 webview
這裡就是最基本的 uiautomator2 操作,詳細操作可以檢視 官方文檔, 這裡使用的 app 是 android bootstrap,可以直接 點選下載下傳 。
d = u2.connect()
d.app_start('com.github.android_app_bootstrap')
d(text='Login').click()
d(text='Baidu').click()
selenium 連接配接 webview
APP 的第三個菜單可以直接打開 baidu 網頁,進而到 webview 網頁。 如果不使用 selenium 連接配接,直接通過 uiautomator2 定位網頁中的元素,是會報錯的。
那如何通過 selenium 連接配接 webview 呢?
- 首先,通過裝置 d 擷取目前操作的 app, 進而得到包名
- 然後,初始化一個 Chrome 浏覽器對象
- 需要注意的是,Chrome 對象需要添加額外的參數,指定連接配接的裝置,webview 綁定的報名,以及配置在 app 中使用 android 浏覽器。
- 之後的操作就和 selenium 做 web 自動化測試沒有任何差別了,無非就是點選網頁,做自動化操作:
driver = webdriver.Chrome('chromedriver_68.exe', options=options)
driver.implicitly_wait(8)
driver.find_element('id', 'index-kw').send_keys('你好')
這段代碼我在哪裡學到的
是不是很好奇,我怎麼知道要這麼寫代碼,才能連接配接 webview ,達到測試效果? 其實世間沒有那麼多神秘的學習方法,隻要你肯用心,一定是可以找到學習的路徑的。 這段代碼清清楚楚的寫在 chrome webdriver 的官方文檔中,隻是,你可能打不開。 截屏看一下:
其他 webdriver 的配置也可以檢視 MDN web docs。展示效果: