1.通過id定位元素
resrouce-id屬性是id:
WebElement element = driver.findElement(By.id("com.oupeng.mini.android:id/search_engine_title"));
2.通過name定位元素
text屬性是name
3.通過ClassName定位元素
class屬性是classname
WebElement element = driver.findElement(By.ClassName("android.widget.TextView"));
4.通過xpath定位
Appium對於xpath定位執行效率是比較低的,一般情況下儘量不用這個定位方式。
WebElement element = driver.findElement(By.xpath("//android.widget.TextView[@index='1']"));
5.通過AccessibilityId定位元素
WebElement element = driver.findElementByAccessibilityId("打開標籤");
6.通過AndroidUiAutomator定位元素
AndroidUIAutomator是一個強有力的元素定位方式,它是通過Android UIAutomator類庫去找元素,可以選擇id、name、className作爲傳入的字符串
WebElement element =driver.findElementByAndroidUIAutomator("new UiSelector().resourceId(\"com.oupeng.mini.android:id/search_engine_title")");
7.web應用元素定位
7.1使用chrome-devtools
在PC瀏覽器地址欄輸入:chrome://inspect/#devices
在移動端打開一個網頁,就可以在PC瀏覽器頁面中看到如下圖
接下來點擊”inspect”,你會發現彈出一個新窗口,如圖:
通過此圖大家可以看到手機屏幕上的頁面已經PC機上顯示了,你可以看到手機wap頁面源碼以及UI界面。
如果DevTools窗口打開後是一片空白的,那是由於被牆的緣故。
在hosts文件中加入以下內容:64.233.162.83 chrome-devtools-frontend.appspot.com
保存之後,在CMD中輸入:ipconfig /flushdns,然後再重新打開就可以了,操作方式和google瀏覽器中一樣,點擊探針去探元素
通過name定位:
WebElement element = driver.findElement(By.name(“word”));
7.2 chrome F12模式
打開PC chrome瀏覽器,點擊F12,點擊toggle device toolbar,刷新下網頁就可以實現了,可以切換設備型號及屏幕的大小。
7.3定位混合應用元素
混合應用是原生APP+webview組成的,可以簡單的理解爲一個原生app的外殼,內部全是html頁面。在處理這樣的app的定位的時候 需要先定位原生APP上的按鈕或者鏈接,然後點擊按鈕或者鏈接,然後經過appium提供的方法,進入webview頁面,通過之前介紹的定位工具和方法進行元素定位了。如果說你的android版本小於4.4,那麼你需要使用Selendroid模式來作爲測試引擎,在測試初始化的時候需要設置該capability。如果你的android版本大於等於4.4,那麼Appium作爲測試引擎,然後通過chromedriver來處理webview。如果你使用的是APPIUM測試引擎,調試WebView需要滿足安卓系統版本爲Android 4.4+已上,並且需要在你的APP內配置相應的代碼,在WebView類中調用靜態方法setWebContentsDebuggingEnabled,如下:
if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.KITKAT) { WebView.setWebContentsDebuggingEnabled(true); }
進入webview的操作:
//這裏使用driver.getContextHandles();獲取app的handles,原生應用會有一個handle,webview也會有一個handle Set<String> contexts = driver.getContextHandles(); for(String cotext:contexts) { System.out.println(context); //會打印出 NATIVE_APP(原生app handle)和WEBVIEW_com.example.testapp(webview的 handle) } //進入webview中 driver.context((String) contexts.toArray()[1]); //操作webview中的內容
這裏使用driver.getContextHandles();獲取app的所有handles,原生應用會有一個NATIVE_APP 的handle,webview也會有一個WEBVIEW_XXX_XXX_XX的handle,確定了webview的handle之後,使用:driver.context(handle的字符串)進入webview頁面