1. 程式人生 > >Appium之測試微信小程式

Appium之測試微信小程式

## 堅持原創輸出,點選藍字關注我吧 ![](https://gitee.com/qinghanstudy/qinghan/raw/master/img/20201202221933.png) 作者:清菡
部落格:Oschina、雲+社群、知乎等各大平臺都有。 # 目錄 - 一、往期回顧 - 二、測試微信小程式 - 1.準備工作 - 2.操作步驟 - 3.注意 - 4.強制設定安卓的程序 - 5.指定 BrowserName 等於空 - 三、程式碼 ## 一、往期回顧 如果用手機自帶的瀏覽器去訪問各種網頁。自然而然都能獲取到 WebView 的,不需要開啟什麼。用原生的、手機自帶的瀏覽器去試下,也能得到對應的結果。 首先,要確保 WebView 的出現,要識別什麼是 WebView,WebView 一出現,就代表有 Html 頁面。那麼接下來的操作,可能就進入 WebView 裡面操作了。 但是看到了 WebView,要進入 WebView,你就面臨了從原生控制元件的操作,進入了 Html 頁面的操作。所以,第一件事情是必須切換,是上下文切換。 1.要切換到這樣的一個 WebView,必須保證我的程式碼當中能夠得到 WebView 的名字。如何保證得到 WebView 的名字?開啟 app 的 WebView debug 屬性。 程式碼中:`cons=driver.contexts`,能夠識別到 WebView 的時候,我們才能夠進入到切換階段,否則你連它的名字是什麼,你都得不到它,又如何切換呢? 2.得到了之後再去切換,切換的時候有 chromedriver 的這個問題,進入 Web 自動化,沒有它配合是做不了的。要確保 chromedriver 的版本要與 WebView 的版本匹配,也要放置在對應的位置。 3.放置之後,你才可能切換成功。切換成功,就是再操作一個 html 頁面了。html 頁面中的元素該如何識別呢? `--uc-devtool工具識別html頁面,定位元素。` ## 二、測試微信小程式 微信小程式和微信公眾號的測試方法都是一樣的。微信小程式和微信公眾號也就是混合應用。 公眾號、小程式都是 WebView,它是個網頁,但是是微信的網頁,但是微信的網頁是絕對不會對外開放 WebView Debug 的。即便這裡看到了 WebView,也獲取不到,獲取不到就切換不了。 重點是進入小程式裡面,這個裡面就是網頁了。小程式基本是網頁做的,點進來之後,就能看到 WebView。 **這種情況下這樣測:** 由於騰訊系 qq、微信等都是基於騰訊自研 x5 核心,安卓是谷歌的 WebView 核心。騰訊系 qq、微信等相當於在谷歌的 WebView 核心上面做了個封裝了,不是原生的 WebView 核心,所以用谷歌的 WebView 核心就有點問題了。 微信小程式,用模擬器可能是搞不定的,模擬器確實很容易閃退,用真機測試比較靠譜。 ### 1.準備工作 1. 微信最新版本。
2. Uc-devtools 工具。
3. 安卓手機(5.0+版本)。
4. Chromedriver 針對自己的版本,通過 Uc-devtools 工具可以識別到 Chromedriver 應該是什麼版本。(它跟 WebView 的版本是不一樣的,但它同樣也代表 Chrome 的版本,需要下載對應的 Chromedriver 驅動它,雖然他不是我們原生的 WebView,只是包裝了下,骨子裡還是 WebView。)
5. Appium 版本-Server 最好在 1.7 以上。 ### 2.操作步驟 想要除錯微信的小程式或者公眾號的時候: 1. 必須開啟它的除錯模式,微信的除錯功能。 可以給任意一個聊天視窗(你玩的好的朋友)傳送這個連結:debugx5.qq.com ![](https://gitee.com/qinghanstudy/qinghan/raw/master/img/20201202204240.png) ![](https://gitee.com/qinghanstudy/qinghan/raw/master/img/20201202200701.png) 2. 平時用微信搜尋一個小程式、公眾號在主頁面一搜就可以了。但是寫自動化指令碼不行哦,人家做了控制的。 **微信在新版本中對小程式除錯入口加上了限制:在微信主視窗下開啟小程式(頂部有個下拉,你曾經用過的小程式,只要往下拉一下,全部都能看得見),在這個地方開啟小程式是識別不到的,所以自動化程式碼就會失效。** 3. 開啟微信->發現->搜一搜,搜尋必要商城,點選對應小程式進入到主頁面。進入小程式後看到的是個 WebView 頁面。 ![](https://gitee.com/qinghanstudy/qinghan/raw/master/img/20201202204308.png) 顯示的 webview 版本是 57.xxx,這裡就是微信 X5 核心的版本,不是 android System webview 版本。同一臺裝置,自帶的是 39.0,這裡就變成 57.0 了。Chromedriver 是支援 57.0 的。這裡要注意區別,要下載一個 Chromedriver,放在 Appium 啟動的時候指定的對應路徑就可以了。同樣也可以點選 inspect 檢視頁面元素。 ### 3.注意 頁面空白載入不出來,需要 fq;
還有,如果點選右上角關閉了小程式之後,一定要記得清理下對應的小程式程序(關閉之後小程式還在後臺執行),再起點選重啟小程式。 如果沒有走這個路徑:`在微信->發現->搜一搜搜尋小程式,即可發現在inspect工具中可以將對應url顯示出來`。去找小程式,可能程式碼就出現一些問題。 所以它這個比較麻煩。通過 Uc-devtools 工具識別了元素,得到了 chromedriver 的版本。 切換的時候還有問題,問題較多: ### 4.強制設定安卓的程序 微信和 qq 很多程序,需要確定當前的 web 網頁,當前的操作是處於哪個程序當中。 官方文件中的描述是這樣的: ![](https://gitee.com/qinghanstudy/qinghan/raw/master/img/20201202211948.png) 現在確實不是核心 WebView,是騰訊封裝的。所以這個地方需要將這個東西開啟出來:`desired_caps[“recreateChromeDriverSessions”]=True`,支援 X5 核心應用的自動化配置。 ![](https://gitee.com/qinghanstudy/qinghan/raw/master/img/20201202212434.png) ![](https://gitee.com/qinghanstudy/qinghan/raw/master/img/20201202212619.png) 因為騰訊的 qq,微信有很多的程序,程序容易搞混切錯了。所以強制設定了下安卓的程序:`desired_caps["chromeOptions"]={"androidProcess":"com.tencent.mm:toolsmp"}` 在 cmd 可以看出,操作的網頁在`com.tencent.mm:toolsmp`裡面,12042 對應的程序是`com.tencent.mm:toolsmp`。不能找成了別的程序,別的程序就是在別的頁面了。 ![](https://gitee.com/qinghanstudy/qinghan/raw/master/img/20201202213306.png) ![](https://gitee.com/qinghanstudy/qinghan/raw/master/img/20201202212915.png) ### 5.指定 browserName 等於空 Web 自動化可以設定引數,這裡也是可以設定引數的。 H5 操作、驅動瀏覽器的時候,是 Web 網頁,有一些 Web 應用。Web 應用的時候就需要制定瀏覽器是 Chrome 還是別的瀏覽器。`desired_caps["browserName"]=""` ![](https://gitee.com/qinghanstudy/qinghan/raw/master/img/20201202213838.png) ![](https://gitee.com/qinghanstudy/qinghan/raw/master/img/20201202214010.png) 不是真的在一個瀏覽器當中開啟一個應用,只是一個應用當中帶著小程式,小程式中帶著瀏覽器性質的。所以指定 browserName 等於空。 ## 三、程式碼 以下程式碼片段只提供思路,請根據實際情況修改。 ```PYTHON // 支援X5核心應用自動化配置 desiredCapabilities.setCapability("recreateChromeDriverSessions", true); // ChromeOptions使用來定製啟動選項,因為在appium中切換context識別webview的時候, // 把com.tencent.mm:toolsmp的webview識別成com.tencent.mm的webview. // 所以為了避免這個問題,加上androidProcess: com.tencent.mm:toolsmp ChromeOptions options = new ChromeOptions(); options.setExperimentalOption("androidProcess", "com.tencent.mm:toolsmp"); desiredCapabilities.setCapability(ChromeOptions.CAPABILITY, options); // 初始化會預設將chrome瀏覽器開啟,需要將Browser置為空 desiredCapabilities.setBrowserName(""); ``` ```python // 休眠一下 Thread.sleep(5000); // 找到微信的發現並點選 androidDriver.findElementByAndroidUIAutomator("new UiSelector().text(\"發現\")").click(); // 點擊發現裡面搜一搜 androidDriver.findElementByAndroidUIAutomator("new UiSelector().text(\"搜一搜\")").click(); Thread.sleep(2000); // 點選搜尋框 androidDriver.findElement(By.id("com.tencent.mm:id/jd")).click(); androidDriver.findElement(By.id("com.tencent.mm:id/jd")).sendKeys("xxx軟體測試"); Thread.sleep(2000); // 點選搜尋結果中的xxx軟體測試(採用adb命令座標點選的方式) execAdb("adb shell input tap 300 200"); Thread.sleep(4000); // 點選xxx軟體測試小程式 execAdb("adb shell input tap 300 500"); // 等待小程式載入完成 Thread.sleep(10000); // 獲取到所有的contexts System.out.println("所有的contexts:" + androidDriver.getContextHandles()); // 切換到小程式webview對應的context中 androidDriver.context("WEBVIEW_com.tencent.mm:toolsmp"); Thread.sleep(2000); // 獲取到所有的han