webview 常用方法点击滑动(转摘别人)

  1. 1元素相关方法
    1. 11点击操作
    2. 12清除操作
    3. 13获得元素属性的值
    4. 14获取元素文本
    5. 15元素是否显示
    6. 16元素是否被选择
    7. 17元素是否被启用
    8. 18提交操作
  2. 2webview中iframe的处理
  3. 3下拉框选值
  4. 4alert处理
  5. 5滚动和滑动
    1. 51滚动操作
    2. 52滑动操作
  6. 6等待元素加载
    1. 61 硬性等待
    2. 62智能等待
    3. 63 设置等待页面加载完毕
  7. 7Spinner下拉菜单选择
  8. 8SeekBar拖动条操作

由于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();

 

}

posted on 2017-08-04 14:21  萌萌安琪拉  阅读(128)  评论(0)    收藏  举报