1、區分APP是H5還是native
(1)手機進入開發者模式,選擇顯示頁面布局邊界,native app中所有的控件都是獨立的紅框,而web H5是一個完整的大框,里面的可以操作的小控件不獨立
(2)adb先連接模擬器,在電腦瀏覽器打開chrome://inspect使用inspect工具,如果能夠在其中看到webview的顯示,那么說明這個地方有個webview,是H5頁面 。(如果需要inspect,需要*翻*牆*下載一下devtools,否則會出現404) 如下面的兩個webview就是H5頁面
2、H5頁面元素定位
如果H5頁面是在瀏覽器中,則Desired Capabilities的設置和啟動APP不同:
如果使用Android原生的瀏覽器打開H5,則使用browserName="Browser" 代替appPackage和appActivity;在appium啟動browser時,如果出現chromedriver不匹配的問題,先
查看手機安卓的系統應用中 android system webview的版本(需要設置顯示系統進程),然后根據手機的android system webview版本下載對應的Chromedriver,下載地址:
https://npm.taobao.org/mirrors/chromedriver/2.23/ ,下載之后有兩種方法配置:
方法1:放到appium路徑下。C:\Program Files\Appium\resources\app\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win (appium-desktop對應的路徑),如果安裝了
appium-server,對應的在appium-server路徑下找到chromedriver進行替換,最好appium-desktop和appium-server都更換一下
方法2(推薦):通過capability設置chromedriverExecutable參數,指定可用的driver路徑
最終的打開瀏覽器及H5頁面的代碼如下
public class AndroidBrowserTest { public static void main(String[] args) throws MalformedURLException, InterruptedException { DesiredCapabilities desiredCapabilities = new DesiredCapabilities(); desiredCapabilities.setCapability("deviceName", "127.0.0.1:7555"); desiredCapabilities.setCapability("platformName", "Android"); desiredCapabilities.setCapability("platformVersion", "6.0.1"); //啟動模擬器自帶的瀏覽器,設置browserName 和可用Chromedriver的路徑 chromedriverExecutable desiredCapabilities.setCapability("browserName", "Browser"); desiredCapabilities.setCapability("chromedriverExecutable", "C:\\Users\\HJY\\Downloads\\chromedriver_win32\\chromedriver.exe"); //可選參數 //不要重置簽名 desiredCapabilities.setCapability("noSign", true); //不清除緩存 desiredCapabilities.setCapability("noReset", true); //設置使用unicode鍵盤,讓自動化腳本實現過程中能夠輸入中文,成對使用,單獨使用下面的某一個屬性會ignore desiredCapabilities.setCapability("unicodeKeyboard", true); desiredCapabilities.setCapability("resetKeyboard", true); AndroidDriver driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), desiredCapabilities); Thread.sleep(5000); //打開H5頁面 driver.get("https://ui.ptlogin2.qq.com/cgi-bin/login?pt_hide_ad=1&style=9&appid=549000929&pt_no_auth=1&pt_wxtest=1&daid=5&s_url=https%3A%2F%2Fh5.qzone.qq.com%2Fmqzone%2Findex"); }
--2.如果是其他第三方瀏覽器,它就是一個安裝的第三方應用,通過appPackage和appActivity當成普通的app來進行啟動
--3.如果使用Chrome,則參數為 browserName="Chrome" 或者 "Chromium"
元素定位:
使用selenium來定位:如果沒有H5頁面的ur,可以在Chrome中打開H5頁面對應的非H5的url,F12打開開發者工具,使用開發者工具的移動端模擬功能切換成移動端模擬狀態(Toggle device toolbar)之后,
刷新一下頁面會自動得到H5頁面的url,同時可以使用Chrome來進行元素定位;
如果頁面既有native又有H5,那么就需要切換context (driver.getContextHandles()獲取contextHandles ),有兩個contextHandles,分別是:NATIVE_APP和CHROMIUM ,使用driver.context("NATIVE_APP")切
換到native,此時使用appiumr的原生安卓元素定位;使用driver.context("CHROMIUM")切換到H5,此時使用selenium的HTML定位
//打開H5頁面 driver.get("https://ui.ptlogin2.qq.com/cgi-bin/login?pt_hide_ad=1&style=9&appid=549000929&pt_no_auth=1&pt_wxtest=1&daid=5&s_url=https%3A%2F%2Fh5.qzone.qq.com%2Fmqzone%2Findex"); System.out.println(driver.getWindowHandle()); //獲取所有handles Set<String> handles=driver.getContextHandles(); for(String s:handles){ System.out.println(s); } //使用selenium定位 driver.findElement(By.id("u")).sendKeys("123456"); //切換為NATIVE_APP,使用appium定位 driver.context("NATIVE_APP"); Thread.sleep(3000); driver.findElement(By.xpath("//android.webkit.WebView[@content-desc=\"手機統一登錄\"]/android.widget.ListView/android.view.View[2]/android.widget.EditText")).sendKeys("222222"); //切回CHROMIUN,使用selenium定位 driver.context("CHROMIUM"); Thread.sleep(3000); driver.findElement(By.id("go")).click();
H5頁面元素定位的總結:H5使用selenium,native使用appium,注意切換context
其他博客的參考:https://blog.csdn.net/ningmengban/article/details/94741949