做者:清菡
博客:Oschina、雲+社區、知乎等各大平臺都有。html
若是用手機自帶的瀏覽器去訪問各類網頁。天然而然都能獲取到 WebView 的,不須要開啓什麼。用原生的、手機自帶的瀏覽器去試下,也能獲得對應的結果。python
首先,要確保 WebView 的出現,要識別什麼是 WebView,WebView 一出現,就表明有 Html 頁面。那麼接下來的操做,可能就進入 WebView 裏面操做了。android
可是看到了 WebView,要進入 WebView,你就面臨了從原生控件的操做,進入了 Html 頁面的操做。因此,第一件事情是必須切換,是上下文切換。web
1.要切換到這樣的一個 WebView,必須保證個人代碼當中可以獲得 WebView 的名字。如何保證獲得 WebView 的名字?開啓 app 的 WebView debug 屬性。chrome
代碼中:cons=driver.contexts
,可以識別到 WebView 的時候,咱們纔可以進入到切換階段,不然你連它的名字是什麼,你都得不到它,又如何切換呢?shell
2.獲得了以後再去切換,切換的時候有 chromedriver 的這個問題,進入 Web 自動化,沒有它配合是作不了的。要確保 chromedriver 的版本要與 WebView 的版本匹配,也要放置在對應的位置。小程序
3.放置以後,你纔可能切換成功。切換成功,就是再操做一個 html 頁面了。html 頁面中的元素該如何識別呢?windows
--uc-devtool工具識別html頁面,定位元素。
微信小程序
微信小程序和微信公衆號的測試方法都是同樣的。微信小程序和微信公衆號也就是混合應用。瀏覽器
公衆號、小程序都是 WebView,它是個網頁,可是是微信的網頁,可是微信的網頁是絕對不會對外開放 WebView Debug 的。即使這裏看到了 WebView,也獲取不到,獲取不到就切換不了。
重點是進入小程序裏面,這個裏面就是網頁了。小程序基本是網頁作的,點進來以後,就能看到 WebView。
這種狀況下這樣測:
因爲騰訊系 qq、微信等都是基於騰訊自研 x5 內核,安卓是谷歌的 WebView 內核。騰訊系 qq、微信等至關於在谷歌的 WebView 內核上面作了個封裝了,不是原生的 WebView 內核,因此用谷歌的 WebView 內核就有點問題了。
微信小程序,用模擬器多是搞不定的,模擬器確實很容易閃退,用真機測試比較靠譜。
想要調試微信的小程序或者公衆號的時候:
能夠給任意一個聊天窗口(你玩的好的朋友)發送這個連接:debugx5.qq.com
微信在新版本中對小程序調試入口加上了限制:在微信主窗口下打開小程序(頂部有個下拉,你曾經用過的小程序,只要往下拉一下,所有都能看得見),在這個地方打開小程序是識別不到的,因此自動化代碼就會失效。
顯示的 webview 版本是 57.xxx,這裏就是微信 X5 內核的版本,不是 android System webview 版本。同一臺設備,自帶的是 39.0,這裏就變成 57.0 了。Chromedriver 是支持 57.0 的。這裏要注意區別,要下載一個 Chromedriver,放在 Appium 啓動的時候指定的對應路徑就能夠了。一樣也能夠點擊 inspect 查看頁面元素。
頁面空白加載不出來,須要 fq;
還有,若是點擊右上角關閉了小程序以後,必定要記得清理下對應的小程序進程(關閉以後小程序還在後臺運行),再起點擊重啓小程序。
若是沒有走這個路徑:在微信->發現->搜一搜搜索小程序,便可發如今inspect工具中能夠將對應url顯示出來
。去找小程序,可能代碼就出現一些問題。
因此它這個比較麻煩。經過 Uc-devtools 工具識別了元素,獲得了 chromedriver 的版本。
切換的時候還有問題,問題較多:
微信和 qq 不少進程,須要肯定當前的 web 網頁,當前的操做是處於哪一個進程當中。
官方文檔中的描述是這樣的:
如今確實不是內核 WebView,是騰訊封裝的。因此這個地方須要將這個東西開啓出來:desired_caps[「recreateChromeDriverSessions」]=True
,支持 X5 內核應用的自動化配置。
由於騰訊的 qq,微信有不少的進程,進程容易搞混切錯了。因此強制設置了下安卓的進程:desired_caps["chromeOptions"]={"androidProcess":"com.tencent.mm:toolsmp"}
在 cmd 能夠看出,操做的網頁在com.tencent.mm:toolsmp
裏面,12042 對應的進程是com.tencent.mm:toolsmp
。不能找成了別的進程,別的進程就是在別的頁面了。
Web 自動化能夠設置參數,這裏也是能夠設置參數的。
H5 操做、驅動瀏覽器的時候,是 Web 網頁,有一些 Web 應用。Web 應用的時候就須要制定瀏覽器是 Chrome 仍是別的瀏覽器。desired_caps["browserName"]=""
不是真的在一個瀏覽器當中打開一個應用,只是一個應用當中帶着小程序,小程序中帶着瀏覽器性質的。因此指定 browserName 等於空。
如下代碼片斷只提供思路,請根據實際狀況修改。
// 支持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("");
// 休眠一下 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); // 獲取到全部的handles Set<String> windowHandles = androidDriver.getWindowHandles(); System.out.println("全部的windowsHandles" + windowHandles); // 遍歷全部的handles,找到當前頁面所在的handle:若是pageSource有包含你想要的元素,就是所要找的handle // 小程序的頁面來回切換也須要:遍歷全部的handles,切換到元素所在的handle for (String windowHandle : windowHandles) { System.out.println("切換到對應的windowHandle:" + windowHandle); androidDriver.switchTo().window(windowHandle); Thread.sleep(2000); if (androidDriver.getPageSource().contains("xxx")) { break; } } // 點擊xx androidDriver.findElement(By.xpath("//*[@id=\"js-tab-bar\"]/li[3]")).click(); // 經過js滾動到指定的元素 (這個元素已經在文檔中間已經存在,可是仍是不可見的) WebElement ele=androidDriver.findElement(By.xpath("//em[text()='xx']")); Thread.sleep(2000); // 將Driver實例化爲js對象 JavascriptExecutor jExecutor=(JavascriptExecutor)androidDriver; // 滑動到上面定位到的元素的位置 jExecutor.executeScript("arguments[0].scrollIntoViewIfNeeded(true);", ele); Thread.sleep(2000);
公衆號 「清菡軟件測試」 首發,更多原創文章:清菡軟件測試 100+原創文章,歡迎關注、交流,禁止第三方擅自轉載。