1.定位元素應(yīng)用元素
1.1通過id定位元素
Android里面定位的id一般為resrouce-id:
代碼可以這樣寫:
driver.findElementById("com.tencent.mm:id/do")
或者:
WebElement element = driver.findElement(By.id("com.tencent.mm:id/do"));
下面的例子展示的是通過id定位到元素并點(diǎn)擊:
@Test
public void test(){
driver.findElementById("com.tencent.mm:id/do").click()
try{
Thread.sleep(3)
}catch(Exception e){
e.printStackTrace();
}
}
1.2通過name定位元素
一般text屬性認(rèn)為是name
@Test
public void doClick() {
//通過name查找元素WebElement el= driver.findElement(By.name("昵稱"));
el.click();
try{//等待3s觀察顯示
Thread.sleep(3000);
}catch(InterruptedException e) {
e.orintStackTrace();
}
}
1.3通過ClassName定位元素
classname指的是class屬性
@Test public void doClick() {
//通過classname查找元素WebElement el= driver.findElement(By.ClassName("android.widget.TextView"));
el.click();
try{//等待3s觀察顯示
Thread.sleep(3000);
}catch(InterruptedException e) {
e.orintStackTrace();
}
}
1.4通過xpath定位
Appium對(duì)于xpath定位執(zhí)行效率是比較低的,也就是說遇到xpath的定位代碼的時(shí)候,執(zhí)行比較慢。迫不得已的情況下盡量不用這個(gè)定位方式。
@Test public void doClick() {
//通過xpath查找元素WebElement el= driver.findElement(By.xpath("http://android.widget.Button[@index='1']"));
el.click();
try{//等待3s觀察顯示
Thread.sleep(3000);
}catch(InterruptedException e) {
e.orintStackTrace();
}
}
1.5通過AccessibilityId定位元素
定位元素的方式和name,id一樣。
定位方式:
findElement(By.AccessibilityId("sharebutton"))
代碼如下:
@Test public void doClick() {
//通過AccessibilityId查找元素WebElement el= driver.findElementByAccessibilityId("sharebutton");
el.click();
try{//等待3s觀察顯示
Thread.sleep(3000);
}catch(InterruptedException e) {
e.orintStackTrace();
}
}
1.6通過AndroidUiAutomator定位元素
AndroidUIAutomator是一個(gè)強(qiáng)有力的元素定位方式,它是通過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();
try{//等待3s觀察顯示
Thread.sleep(3000);
}catch(InterruptedException e) {
e.orintStackTrace();
}
}
2.處理純web應(yīng)用元素定位
2.1使用chrome-devtools
這是谷歌提供的一個(gè)移動(dòng)端Web開發(fā)調(diào)試工具,通過它我們可以調(diào)試手機(jī)頁面。通過調(diào)試我們可以看到wap頁面的源碼,從而進(jìn)行元素的定位。那么這個(gè)工具該如何使用呢?首先你要有一臺(tái)PC,上面安裝了chrome瀏覽器;一臺(tái)安卓手機(jī),上面安裝了chrome移動(dòng)版的瀏覽器。將你的手機(jī)通過USB數(shù)據(jù)線連接到你的PC機(jī)并開啟USB調(diào)試模式(由于每個(gè)機(jī)器不一樣,所以開啟USB模式的方式就不再詳細(xì)說明),然后在CMD中輸入adb devices看看設(shè)備是不是鏈接成功了:
接下來在PC機(jī)上打開chrome瀏覽器
然后在地址欄輸入:chrome://inspect/#devices
緊接著在你的Android手機(jī)上打開chrome瀏覽器并輸入百度首頁地址:
當(dāng)你打開了百度首頁之后,我們?cè)诨氐絇C版的chrome瀏覽器上面的chrome://inspect/#devices頁面下觀察:
接下來點(diǎn)擊”inspect”,你會(huì)發(fā)現(xiàn)彈出一個(gè)新窗口,如圖:
通過此圖大家可以看到手機(jī)屏幕上的頁面已經(jīng)PC機(jī)上顯示了,你可以看到手機(jī)wap頁面源碼以及UI界面。使用用DevTools特別重要的一點(diǎn)是:如果你點(diǎn)擊inspect打開的DevTools窗口一片空白,且刷新無效時(shí),那極有可能是由于被墻的緣故。
在hosts文件最后追加以下內(nèi)容:
64.233.162.83 chrome-devtools-frontend.appspot.com
保存之后,在CMD中輸入:ipconfig /flushdns
刷新DNS之后,打開的DevTools窗口就不會(huì)在是空白的了。
在DevTools窗口頂部有個(gè)“Select an element in the page to inspect it”按鈕,如下圖所示:
百度一下button的元素信息
通過id定位:
WebElement searchButton = driver.findElement(By.id(“index-bn”));
代碼如下:
public AndroidDriverdriver;
@Before Class public void startTest() throwsMalformedURLException {
DesiredCapabilities capabilities=newDesiredCapabilities();
capabilities.setCapability("platformName","Android");
capabilities.setCapability("deviceName","MeiZu MX3");
capabilities.setCapability("platformVersion", "5.0.1");
capabilities.setCapability("browserName", "Chrome");
driver=new AndroidDriver(newURL("http://127.0.0.1:4723/wd/hub"), capabilities);
driver.manage().timeouts().implicitlyWait(6, TimeUnit.SECONDS);
}
@After Class public void afterClass() {
driver.quit();
}
@Test public void addContact() {//打開百度首頁driver.get("https://www.baidu.com");
//輸入框元素WebElement inputBox= driver.findElement(By.id("index-kw"));
//輸入JAVA關(guān)鍵字inputBox.sendKeys("JAVA");
//百度一下按鈕WebElement searchButton= driver.findElement(By.id("index-bn"));
//點(diǎn)擊百度一下按鈕earchButton.click();
try{
Thread.sleep(2000);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
2.1chrome toggle device mode 模式
打開PC chrome瀏覽器,點(diǎn)擊F12
點(diǎn)擊toggle device mode,F5刷新就可以實(shí)現(xiàn)方式1的效果,而且比方式1簡(jiǎn)單。
可以切換設(shè)備型號(hào)及屏幕的大小。
3.定位混合應(yīng)用元素
混合應(yīng)用是原生APP+webview組成的,可以簡(jiǎn)單的理解為一個(gè)原生app的外殼,內(nèi)部全是html頁面。在處理這樣的app的定位的時(shí)候 需要先定位原生APP上的按鈕或者鏈接,然后點(diǎn)擊按鈕或者鏈接,然后經(jīng)過appium提供的方法,進(jìn)入webview頁面,通過之前介紹的定位工具和方法進(jìn)行元素定位了。如果說你的android版本小于4.4,那么你需要使用Selendroid模式來作為測(cè)試引擎,在測(cè)試初始化的時(shí)候需要設(shè)置該capability。如果你的android版本大于等于4.4,那么Appium作為測(cè)試引擎,然后通過chromedriver來處理webview。如果你使用的是APPIUM測(cè)試引擎,調(diào)試WebView需要滿足安卓系統(tǒng)版本為Android 4.4+已上,并且需要在你的APP內(nèi)配置相應(yīng)的代碼,在WebView類中調(diào)用靜態(tài)方法setWebContentsDebuggingEnabled,如下:
if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
進(jìn)入webview的操作:
//這里使用driver.getContextHandles();獲取app的handles,原生應(yīng)用會(huì)有一個(gè)handle,webview也會(huì)有一個(gè)handle
Set contexts =driver.getContextHandles();
for(String cotext:contexts) {
System.out.println(context);
//會(huì)打印出? NATIVE_APP(原生app handle)和WEBVIEW_com.example.testapp(webview的 handle)
}
//進(jìn)入webview中
driver.context((String) contexts.toArray()[1]);
//操作webview中的內(nèi)容