原文地址https://www.cnblogs.com/sundalian/p/5629500.htmlhtml
Android裏面定位的id通常爲resrouce-id:android
代碼能夠這樣寫:web
WebElement element = driver.findElement(By.id("com.tencent.mm:id/do"));
或者:chrome
driver.findElementById("com.tencent.mm:id/do")
下面的例子展現的是經過id定位到元素並點擊:瀏覽器
@Test public void doClick() { //經過id查找元素 WebElement el = driver.findElement(By.id("com.tencent.mm:id/do")); el.click(); //等待3s觀察顯示 try { Thread.sleep(3000); } catch(InterruptedException e) { e.orintStackTrace(); } }
通常text屬性認爲是nameapp
@Test public void doClick() { //經過name查找元素 WebElement el = driver.findElement(By.name("暱稱")); el.click(); //等待3s觀察顯示 try { Thread.sleep(3000); } catch(InterruptedException e) { e.orintStackTrace(); } }
classname指的是class屬性frontend
@Test public void doClick() { //經過classname查找元素 WebElement el = driver.findElement(By.ClassName("android.widget.TextView")); el.click(); //等待3s觀察顯示 try { Thread.sleep(3000); } catch(InterruptedException e) { e.orintStackTrace(); } }
Appium對於xpath定位執行效率是比較低的,也就是說遇到xpath的定位代碼的時候,執行比較慢。無可奈何的狀況下儘可能不用這個定位方式。chrome-devtools
代碼:工具
@Test public void doClick() { //經過xpath查找元素 WebElement el = driver.findElement(By.xpath("//android.widget.Button[@index='1']")); el.click(); //等待3s觀察顯示 try { Thread.sleep(3000); } catch(InterruptedException e) { e.orintStackTrace(); } }
定位元素的方式和name,id同樣。測試
定位方式:
findElement(By.AccessibilityId("sharebutton"))
代碼以下:
@Test public void doClick() { //經過AccessibilityId查找元素 WebElement el = driver.findElementByAccessibilityId("sharebutton"); el.click(); //等待3s觀察顯示 try { Thread.sleep(3000); } catch(InterruptedException e) { e.orintStackTrace(); } }
AndroidUIAutomator是一個強有力的元素定位方式,它是經過Android UIAutomator類庫去找元素,定位方式:
findElement(By.AndroidUIAutomator(String UIAuto));
能夠選擇id,nameclassName,description做爲傳入的字符串
WebElement el = driver.findElementByAndroidUIAutomator("new UiSelector().resourceId(\"com.tencent.mm:id/do\")");
代碼以下:
@Test public void doClick() { //經過AndroidUIAutomator查找元素 WebElement el = driver.findElementByAndroidUIAutomator("new UiSelector().description(\"sharebutton\")"); el.click(); //等待3s觀察顯示 try { Thread.sleep(3000); } catch(InterruptedException e) { e.orintStackTrace(); } }
這是谷歌提供的一個移動端Web開發調試工具,經過它咱們能夠調試手機頁面。經過調試咱們能夠看到wap頁面的源碼,從而進行元素的定位。那麼這個工具該如何使用呢?首先你要有一臺PC,上面安裝了chrome瀏覽器;一臺安卓手機,上面安裝了chrome移動版的瀏覽器。將你的手機經過USB數據線鏈接到你的PC機並開啓USB調試模式(因爲每一個機器不同,因此開啓USB模式的方式就再也不詳細說明),而後在CMD中輸入adb devices看看設備是否是連接成功了:
接下來在PC機上打開chrome瀏覽器
而後在地址欄輸入:chrome://inspect/#devices
緊接着在你的Android手機上打開chrome瀏覽器並輸入百度首頁地址:
當你打開了百度首頁以後,咱們在回到PC版的chrome瀏覽器上面的chrome://inspect/#devices頁面下觀察:
接下來點擊」inspect」,你會發現彈出一個新窗口,如圖:
經過此圖你們能夠看到手機屏幕上的頁面已經PC機上顯示了,你能夠看到手機wap頁面源碼以及UI界面。使用用DevTools特別重要的一點是:若是你點擊inspect打開的DevTools窗口一片空白,且刷新無效時,那極有多是因爲被牆的緣故。
在hosts文件最後追加如下內容:
64.233.162.83 chrome-devtools-frontend.appspot.com
保存以後,在CMD中輸入:ipconfig /flushdns
刷新DNS以後,打開的DevTools窗口就不會在是空白的了。
在DevTools窗口頂部有個「Select an element in the page to inspect it」按鈕,以下圖所示:
百度一下button的元素信息
經過id定位:
WebElement searchButton = driver.findElement(By.id(「index-bn」));
百度搜索關鍵字的代碼:
public AndroidDriver<WebElement> driver; @BeforeClass public void startTest() throws MalformedURLException { DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability("platformName","Android"); capabilities.setCapability("deviceName","MeiZu MX3"); capabilities.setCapability("platformVersion", "5.0.1"); capabilities.setCapability("browserName", "Chrome"); driver = new AndroidDriver<WebElement>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities); driver.manage().timeouts().implicitlyWait(6, TimeUnit.SECONDS); } @AfterClass public void afterClass() { driver.quit(); } @Test public void addContact() { //打開百度首頁 driver.get("https://www.baidu.com"); //輸入框元素 WebElement inputBox = driver.findElement(By.id("index-kw")); //輸入JAVA關鍵字 inputBox.sendKeys("JAVA"); //百度一下按鈕 WebElement searchButton = driver.findElement(By.id("index-bn")); //點擊百度一下按鈕 earchButton.click(); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } }
打開PC chrome瀏覽器,點擊F12
點擊toggle device mode,F5刷新就能夠實現方式1的效果,並且比方式1簡單。
能夠切換設備型號及屏幕的大小。
混合應用是原生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頁面