APPIUM Android 定位方式

來源:互聯網
上載者:User

標籤:hub   資訊   .class   ring   imp   es2015   方法   view   hand   

原文地址https://www.cnblogs.com/sundalian/p/5629500.html

1.定位元素應用元素

 

1.1通過id定位元素

Android裡面定位的id一般為resrouce-id:

代碼可以這樣寫:

WebElement element = driver.findElement(By.id("com.tencent.mm:id/do"));

或者:

driver.findElementById("com.tencent.mm:id/do")

下面的例子展示的是通過id定位到元素並點擊:

@Testpublic 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();    }}

 

1.2通過name定位元素

一般text屬性認為是name

@Testpublic void doClick() {    //通過name尋找元素    WebElement el = driver.findElement(By.name("暱稱"));    el.click();    //等待3s觀察顯示    try {    Thread.sleep(3000);    } catch(InterruptedException e) {    e.orintStackTrace();    }}

 

1.3通過ClassName定位元素

classname指的是class屬性

@Testpublic void doClick() {    //通過classname尋找元素    WebElement el = driver.findElement(By.ClassName("android.widget.TextView"));    el.click();    //等待3s觀察顯示    try {    Thread.sleep(3000);    } catch(InterruptedException e) {    e.orintStackTrace();    }}

 

1.4通過xpath定位

Appium對於xpath定位執行效率是比較低的,也就是說遇到xpath的定位代碼的時候,執行比較慢。迫不得已的情況下盡量不用這個定位方式。

代碼:

@Testpublic 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();    }}

 

1.5通過AccessibilityId定位元素

定位元素的方式和name,id一樣。

定位方式:

findElement(By.AccessibilityId("sharebutton"))

代碼如下:

@Testpublic void doClick() {    //通過AccessibilityId尋找元素    WebElement el = driver.findElementByAccessibilityId("sharebutton");    el.click();    //等待3s觀察顯示    try {    Thread.sleep(3000);    } catch(InterruptedException e) {    e.orintStackTrace();    }}

 

1.6通過AndroidUiAutomator定位元素

AndroidUIAutomator是一個強有力的元素定位方式,它是通過Android UIAutomator類庫去找元素,定位方式:

findElement(By.AndroidUIAutomator(String UIAuto));

可以選擇id,nameclassName,description作為傳入的字串

WebElement el =driver.findElementByAndroidUIAutomator("new UiSelector().resourceId(\"com.tencent.mm:id/do\")");

代碼如下:

@Testpublic void doClick() {    //通過AndroidUIAutomator尋找元素    WebElement el = driver.findElementByAndroidUIAutomator("new UiSelector().description(\"sharebutton\")");    el.click();    //等待3s觀察顯示    try {    Thread.sleep(3000);    } catch(InterruptedException e) {    e.orintStackTrace();    }}

 

2.處理純web應用元素定位

 

2.1使用chrome-devtools

這是Google提供的一個移動端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;@BeforeClasspublic 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);}@AfterClasspublic void afterClass() {driver.quit();}@Testpublic 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();}}

 

2.1chrome toggle device mode 模式

開啟PC chrome瀏覽器,點擊F12

點擊toggle device mode,F5重新整理就可以實現方式1的效果,而且比方式1簡單。

可以切換裝置型號及螢幕的大小。

 

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也會有一個handleSet<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頁面

APPIUM Android 定位方式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.