由於appium是擴展了Webdriver協議,所以可以使用webdriver提供的方法,比如在處理webview頁面,完全可以使用webdriver中的方法。當然在原生應用中,也可以使用。
1.元素相關方法
1.1點擊操作
WebElement button = driver.findElement(By.id(“login”));
或者
WebElement button = driver.findElementById(“login”) //然后執行點擊操作 button.click();
由元素對象調用click()方法。
1.2清除操作
WebElement username = driver.findElement(By.name(“username_input”));
或者
WebElement username = driver.findElementName(“username_input”);
username.clear();
當執行這個方法的時候,輸入框的內容會被清空。
1.3獲得元素屬性的值
getAttribute(java.lang.String name)這個方法。
代碼如下:
WebElement username = driver.findElement(By.id(“u”));
或者
WebElement username = driver.findElementId(“u”);
username. getAttribute(“XXXXX”);
這樣就可以獲得XXXX = “abc”,abc的值了
1.4獲取元素文本
登錄按鈕的源碼:
<button class="btn btn-major" id="loginBtn" type="button">登錄</button>
WebElement中提供一個getText()方法可以獲取,代碼如下:
WebElement login= driver.findElement(By.id(“loginBtn”));
或者
WebElement login= driver.findElementId(“loginBtn”);
login.getText();
這樣就能獲取“登錄”文字了。
對於原生APP,使用的方法是一樣的,直接用元素對象引用getText方法即可。
1.5元素是否顯示
判斷這個頁面元素是不是顯示出來了。
方法有個返回值類型是boolean,也就是說如果元素顯示了返回true,如果沒有顯示返回false。
WebElement login= driver.findElement(By.id(“loginBtn”));
或者
WebElement login= driver.findElementId(“loginBtn”); //webview或者原生app都通用 login.isDisplayed();
1.6元素是否被選擇
有這樣的情況,復選框或者是單選框,我們需要判斷這個框是不是被勾選了,此時這個方法就派上用場了。
WebElement checkbox= driver.findElement(By.id(“checkbox_id”));
或者
WebElement checkbox= driver.findElementId(“checkbox_id”); //webview和原生app通用 checkbox.isSeelected();
checkbox.isSeelected();會有返回值,如果勾選了,返回true,如果沒有勾選返回false。
1.7元素是否被啟用
有些按鈕,可能在頁面顯示上被灰掉,就是不讓點擊,這個時候這個按鈕是不可用的。那么我們如何判斷這個按鈕是否能被點擊呢?請用isEnabled()方法
WebElement login= driver.findElement(By.id(“loginBtn”));
或者
WebElement login= driver.findElementById(“loginBtn”); //webview和原生app通用 login. isEnabled ();
如果可用返回true,如果不可用返回false。
1.8提交操作
在有表單的的界面上,可以不通過點擊按鈕進行提交操作,這就需要用到submit()方法
比如一個webview元素的源碼:
<button class="btn btn-major" id="loginBtn" type="submit">登錄</button>
此源碼需要在一個表單(Form)中,並且type需要時submit類型,此時我們的代碼可以這樣寫:
WebElement login= driver.findElement(By.id(“loginBtn”));
或者
WebElement login= driver.findElementById(“loginBtn”); //webview和原生的app 提交按鈕通用 login. submit();
2.webview中iframe的處理
在混合應用APP中的webview頁面中也會遇到frame的情況,處理情況和web頁面中的frame處理一樣。
selenium webdriver中提供了進入一個iframe的方法:
WebDriver org.openqa.selenium.WebDriver.TargetLocator.frame(String nameOrId)
也提供了一個返回default content的方法:
WebDriver org.openqa.selenium.WebDriver.TargetLocator.defaultContent()
核心代碼:
driver.switchTo().frame(“XXX”); //傳入的是iframe的ID
如果要返回到以前的默認content,可以使用:
dr.switchTo().defaultContent();
3.下拉框選值
webview下拉框操作:先定位出你要處理的下拉框(元素),然后將此元素傳入Select對象中,接着用Select中的相關方法來選取下拉值。
我們先要定位這個Select下拉框(元素)
WebElement element_province = driver.findElement(By.id(“province”));
然后把element傳入Select
Select province = new Select(element_province);
然后由Select來操作下拉框
province.selectByIndex(0) //province .selectByVisibleText(“XXX”)
4.alert處理
@Test public void handleAlert() throws InterruptedException { WebElement showAlert= driver.findElement(By.name("Show Alert")); //點擊之后彈出alert窗口 showAlert.click(); WebElement yes=driver.findElement(By.name("Yes")); //點擊yes按鈕之后alert窗口消失 yes.click(); //暫停4秒觀察顯示 Thread.sleep(4000); }
Alert我們無法用selenium alert api處理 ,我們使用的是直接找到按鈕的方式。這樣就可以找到Yes按鈕,然后點擊yes按鈕即可。
5.滾動和滑動
5.1滾動操作
實現代碼:
@Test public void scroll() throws InterruptedException { //滑動直到查找到E driver.scrollToExact("E"); }
5.2滑動操作
@Test public void swipe() throws InterruptedException { Thread.sleep(1000); TouchAction tAction=new TouchAction(driver); tAction.press(400,500).waitAction(800).moveTo(50,500).release().perform(); Thread.sleep(4000); }
其中的核心代碼是:
TouchAction tAction=new TouchAction(driver); tAction.press(400,500).waitAction(800).moveTo(50,500).release().perform();
使用的是TouchAction類,首先調用press方法,然后加上等待動作的緩沖時間800毫秒,接着移動到坐標(moveTo),當移動到指定坐標點的時候,松開手。最后調用perform方法就可執行整個操作。
6.等待元素加載
6.1 硬性等待
Thread.sleep(int sleeptime);
此方法會把當前的driver進程暫停一段時間,然后在執行接下來的操作。這方法有個缺點就是,你不能確定元素到底多久加載出來,如果你的sleepTimes是10秒,但是元素2秒就加載出來了,那么此進程還會繼續等待8秒,造成時間浪費。所以非必要情況下不要使用此方法。
6.2智能等待
public void waitForElementToLoad(int timeOut, final By By) { try { (new WebDriverWait(driver, timeOut)).until(new ExpectedCondition<Boolean>() { public Boolean apply(WebDriver driver) { WebElement element = driver.findElement(By); return element.isDisplayed(); } }); } catch (TimeoutException e) { Assert.fail("超時!! " + timeOut + " 秒之后還沒找到元素 [" + By + "]",e); } }
此方法有兩個參數,timeOut是等待元素的超時時間,就是說過了這個時間如果元素還沒加載出來就報錯。By對象,這個是你元素的定位方式比如By.id(“login”);
這個方法會在給定timeOut去查找元素,如果在小於timeOut的時間內找到了元素,剩下的時間不在等待,直接執行接下來的操作。
6.3 設置等待頁面加載完畢
int pageLoadTime = 10; driver.manage().timeouts().pageLoadTimeout(pageLoadTime, TimeUnit.SECONDS);
這段代碼,加載driver.get(url)方法之前,他們等待你給定的時間,如果在給定時間內網頁還是沒有加載出來就會報錯,如果在小於給定時間內加載完畢了,剩下的時間不再等待。
7.Spinner下拉菜單選擇
Spinner是安卓SDK中的一個下拉菜單組件,它可以讓用戶從下拉框中選擇不同值。
@Test public void testSpinner() throws InterruptedException { WebElement spinner=driver.findElement(By.id("android:id/text1")); //點擊下拉框 spinner.click(); //滑動查找直到摘到india driver.scrollToExact("India"); WebElement optionIndia=driver.findElement(By.name("India")); //點擊一下India optionIndia.click(); //暫停4秒觀察顯示 Thread.sleep(4000); }
8.SeekBar拖動條操作
實現代碼:
@Test public void testSeekbar() throws InterruptedException { //找到拖動條 WebElement slider=driver.findElementById("com.android.androidui:id/seekBar1"); //獲取拖動條的開始拖動點的x坐標 int xAxisStartPoint = slider.getLocation().getX(); //獲取拖動條的結束點的x坐標 = 開始x坐標+滑動條元素的寬度 int xAxisEndPoint = xAxisStartPoint + slider.getSize().getWidth(); //滾動條的y坐標 int yAxis = slider.getLocation().getY(); TouchAction act=new TouchAction(driver); act.press(xAxisStartPoint,yAxis).waitAction(800).moveTo(xAxisEndPoint- 1,yAxis).release().perform(); } @AfterClass public void afterClass() { driver.closeApp(); }