欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

Appium之測試微信小程序 - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開發(fā)/軟件開發(fā)

知識

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!

您當前位置>首頁 » 新聞資訊 » 小程序相關(guān) >

Appium之測試微信小程序

發(fā)表時間:2021-1-5

發(fā)布人:葵宇科技

瀏覽次數(shù):131


一、往期回顧

如果用手機自帶的瀏覽器去訪問各種網(wǎng)頁。自然而然都能獲取到 WebView 的,不需要開啟什么。用原生的、手機自帶的瀏覽器去試下,也能得到對應(yīng)的結(jié)果。

首先,要確保 WebView 的出現(xiàn),要識別什么是 WebView,WebView 一出現(xiàn),就代表有 Html 頁面。那么接下來的操作,可能就進入 WebView 里面操作了。

但是看到了 WebView,要進入 WebView,你就面臨了從原生控件的操作,進入了 Html 頁面的操作。所以,第一件事情是必須切換,是上下文切換。

1.要切換到這樣的一個 WebView,必須保證我的代碼當中能夠得到 WebView 的名字。如何保證得到 WebView 的名字?開啟 app 的 WebView debug 屬性。

代碼中:cons=driver.contexts,能夠識別到 WebView 的時候,我們才能夠進入到切換階段,否則你連它的名字是什么,你都得不到它,又如何切換呢?

2.得到了之后再去切換,切換的時候有 chromedriver 的這個問題,進入 Web 自動化,沒有它配合是做不了的。要確保 chromedriver 的版本要與 WebView 的版本匹配,也要放置在對應(yīng)的位置。

3.放置之后,你才可能切換成功。切換成功,就是再操作一個 html 頁面了。html 頁面中的元素該如何識別呢?

--uc-devtool工具識別html頁面,定位元素。


二、測試微信小程序

微信小程序和微信公眾號的測試方法都是一樣的。微信小程序和微信公眾號也就是混合應(yīng)用。

公眾號、小程序都是 WebView,它是個網(wǎng)頁,但是是微信的網(wǎng)頁,但是微信的網(wǎng)頁是絕對不會對外開放 WebView Debug 的。即便這里看到了 WebView,也獲取不到,獲取不到就切換不了。

重點是進入小程序里面,這個里面就是網(wǎng)頁了。小程序基本是網(wǎng)頁做的,點進來之后,就能看到 WebView。

這種情況下這樣測:

由于騰訊系 qq、微信等都是基于騰訊自研 x5 內(nèi)核,安卓是谷歌的 WebView 內(nèi)核。騰訊系 qq、微信等相當于在谷歌的 WebView 內(nèi)核上面做了個封裝了,不是原生的 WebView 內(nèi)核,所以用谷歌的 WebView 內(nèi)核就有點問題了。

微信小程序,用模擬器可能是搞不定的,模擬器確實很容易閃退,用真機測試比較靠譜。

1.準備工作
  1. 微信最新版本。
  2. Uc-devtools 工具。
  3. 安卓手機(5.0+版本)。
  4. Chromedriver 針對自己的版本,通過 Uc-devtools 工具可以識別到 Chromedriver 應(yīng)該是什么版本。(它跟 WebView 的版本是不一樣的,但它同樣也代表 Chrome 的版本,需要下載對應(yīng)的 Chromedriver 驅(qū)動它,雖然他不是我們原生的 WebView,只是包裝了下,骨子里還是 WebView。)
  5. Appium 版本-Server 最好在 1.7 以上。
2.操作步驟

想要調(diào)試微信的小程序或者公眾號的時候:

  1. 必須開啟它的調(diào)試模式,微信的調(diào)試功能。

可以給任意一個聊天窗口(你玩的好的朋友)發(fā)送這個鏈接:debugx5.qq.com

  1. 平時用微信搜索一個小程序、公眾號在主頁面一搜就可以了。但是寫自動化腳本不行哦,人家做了控制的。

微信在新版本中對小程序調(diào)試入口加上了限制:在微信主窗口下打開小程序(頂部有個下拉,你曾經(jīng)用過的小程序,只要往下拉一下,全部都能看得見),在這個地方打開小程序是識別不到的,所以自動化代碼就會失效。

  1. 打開微信->發(fā)現(xiàn)->搜一搜,搜索必要商城,點擊對應(yīng)小程序進入到主頁面。進入小程序后看到的是個 WebView 頁面。

顯示的 webview 版本是 57.xxx,這里就是微信 X5 內(nèi)核的版本,不是 android System webview 版本。同一臺設(shè)備,自帶的是 39.0,這里就變成 57.0 了。Chromedriver 是支持 57.0 的。這里要注意區(qū)別,要下載一個 Chromedriver,放在 Appium 啟動的時候指定的對應(yīng)路徑就可以了。同樣也可以點擊 inspect 查看頁面元素。


3.注意

頁面空白加載不出來,需要 fq;

還有,如果點擊右上角關(guān)閉了小程序之后,一定要記得清理下對應(yīng)的小程序進程(關(guān)閉之后小程序還在后臺運行),再起點擊重啟小程序。

如果沒有走這個路徑:在微信->發(fā)現(xiàn)->搜一搜搜索小程序,即可發(fā)現(xiàn)在inspect工具中可以將對應(yīng)url顯示出來。去找小程序,可能代碼就出現(xiàn)一些問題。

所以它這個比較麻煩。通過 Uc-devtools 工具識別了元素,得到了 chromedriver 的版本。

切換的時候還有問題,問題較多:


4.強制設(shè)置安卓的進程

微信和 qq 很多進程,需要確定當前的 web 網(wǎng)頁,當前的操作是處于哪個進程當中。

官方文檔中的描述是這樣的:

現(xiàn)在確實不是內(nèi)核 WebView,是騰訊封裝的。所以這個地方需要將這個東西開啟出來:desired_caps[“recreateChromeDriverSessions”]=True,支持 X5 內(nèi)核應(yīng)用的自動化配置。

因為騰訊的 qq,微信有很多的進程,進程容易搞混切錯了。所以強制設(shè)置了下安卓的進程:desired_caps["chromeOptions"]={"androidProcess":"com.tencent.mm:toolsmp"}

在 cmd 可以看出,操作的網(wǎng)頁在com.tencent.mm:toolsmp里面,12042 對應(yīng)的進程是com.tencent.mm:toolsmp。不能找成了別的進程,別的進程就是在別的頁面了。

5.指定 browserName 等于空

Web 自動化可以設(shè)置參數(shù),這里也是可以設(shè)置參數(shù)的。

H5 操作、驅(qū)動瀏覽器的時候,是 Web 網(wǎng)頁,有一些 Web 應(yīng)用。Web 應(yīng)用的時候就需要制定瀏覽器是 Chrome 還是別的瀏覽器。desired_caps["browserName"]=""

不是真的在一個瀏覽器當中打開一個應(yīng)用,只是一個應(yīng)用當中帶著小程序,小程序中帶著瀏覽器性質(zhì)的。所以指定 browserName 等于空。

三、代碼

以下代碼片段只提供思路,請根據(jù)實際情況修改。

// 支持X5內(nèi)核應(yīng)用自動化配置
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("");
// 休眠一下
Thread.sleep(5000);
// 找到微信的發(fā)現(xiàn)并點擊
androidDriver.findElementByAndroidUIAutomator("new UiSelector().text(\"發(fā)現(xiàn)\")").click();
// 點擊發(fā)現(xiàn)里面搜一搜
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);

// 點擊搜索結(jié)果中的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對應(yīng)的context中
androidDriver.context("WEBVIEW_com.tencent.mm:toolsmp");
Thread.sleep(2000);

// 獲取到所有的handles
Set<String> windowHandles = androidDriver.getWindowHandles();
System.out.println("所有的windowsHandles" + windowHandles);

// 遍歷所有的handles,找到當前頁面所在的handle:如果pageSource有包含你想要的元素,就是所要找的handle
// 小程序的頁面來回切換也需要:遍歷所有的handles,切換到元素所在的handle
for (String windowHandle : windowHandles) {
    System.out.println("切換到對應(yīng)的windowHandle:" + windowHandle);
    androidDriver.switchTo().window(windowHandle);
    Thread.sleep(2000);
    if (androidDriver.getPageSource().contains("xxx")) {
        break;
    }
}
// 點擊xx
androidDriver.findElement(By.xpath("http://*[@id=\"js-tab-bar\"]/li[3]")).click();

// 通過js滾動到指定的元素 (這個元素已經(jīng)在文檔中間已經(jīng)存在,但是還是不可見的)
WebElement ele=androidDriver.findElement(By.xpath("http://em[text()='xx']"));
Thread.sleep(2000);
// 將Driver實例化為js對象
JavascriptExecutor jExecutor=(JavascriptExecutor)androidDriver;
// 滑動到上面定位到的元素的位置
jExecutor.executeScript("arguments[0].scrollIntoViewIfNeeded(true);", ele);

Thread.sleep(2000);

相關(guān)案例查看更多