多测师是一家拥有先进的教学理念,强大的师资团队,业内好评甚多的接口自动化测试培训机构!

17727591462

联系电话

您现在所在位置:接口自动化测试培训 > 新闻资讯

appium三种等待元素的方法-自动化测试

更新时间:2022-03-29 09:23:18 作者:多测师 浏览:454

  学过selenium的都知道,一般等待元素加载有三种办法:

  (1)sleep 强制等待。示例:Thread.sleep(60000)

  (2)implicitlyWait 隐式等待。全局等待30s不管元素是否已经加载

  示例:driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

  (3)WebDriverWait 显示等待,这个需要增加一定等待时间,显示等待时间可以通过WebDriverWait 和util来决定,比如这个timeOut是60,如果该元素60s以内出现就不在等待

  WebDriverWait wait = new WebDriverWait(driver, 60);

  WebElement e= wait.until(new ExpectedCondition() {

  @Override

  public WebElement apply(WebDriver d) {

  return d.findElement(By.id("q"));

  }

  })

appium三种等待元素的方法-自动化测试

  以上三种方法中,只用WebDriverWait是selenium所特有,在Java-client中也找不到相应的,如果想使用这种方法怎么办?

  改造轮子,首先添加AndroidDriverWait.java, 其实是将WebDriverWait的类型改成AndroidDriverWait

  具体代码如下:

  import org.openqa.selenium.NotFoundException;

  import org.openqa.selenium.TimeoutException;

  import org.openqa.selenium.WebDriver;

  import org.openqa.selenium.WebDriverException;

  import org.openqa.selenium.remote.RemoteWebDriver;

  import org.openqa.selenium.support.ui.Clock;

  import org.openqa.selenium.support.ui.FluentWait;

  import org.openqa.selenium.support.ui.Sleeper;

  import org.openqa.selenium.support.ui.SystemClock;

  import io.appium.java_client.android.AndroidDriver;

  import java.util.concurrent.TimeUnit;

  /**

  * A specialization of {@link FluentWait} that uses WebDriver instances.

  */

  public class AndroidDriverWait extends FluentWait{

  public final static long DEFAULT_SLEEP_TIMEOUT = 500;

  private final WebDriver driver;

  /**

  * Wait will ignore instances of NotFoundException that are encountered (thrown) by default in

  * the 'until' condition, and immediately propagate all others. You can add more to the ignore

  * list by calling ignoring(exceptions to add).

  *

  * @param driver The WebDriver instance to pass to the expected conditions

  * @param timeOutInSeconds The timeout in seconds when an expectation is called

  * @see AndroidDriverWait#ignoring(java.lang.Class)

  */

  public AndroidDriverWait(AndroidDriver driver, long timeOutInSeconds) {

  this(driver, new SystemClock(), Sleeper.SYSTEM_SLEEPER, timeOutInSeconds, DEFAULT_SLEEP_TIMEOUT);

  }

  /**

  * Wait will ignore instances of NotFoundException that are encountered (thrown) by default in

  * the 'until' condition, and immediately propagate all others. You can add more to the ignore

  * list by calling ignoring(exceptions to add).

  *

  * @param driver The WebDriver instance to pass to the expected conditions

  * @param timeOutInSeconds The timeout in seconds when an expectation is called

  * @param sleepInMillis The duration in milliseconds to sleep between polls.

  * @see AndroidDriverWait#ignoring(java.lang.Class)

  */

  public AndroidDriverWait(AndroidDriver driver, long timeOutInSeconds, long sleepInMillis) {

  this(driver, new SystemClock(), Sleeper.SYSTEM_SLEEPER, timeOutInSeconds, sleepInMillis);

  }

  /**

  * @param driver The WebDriver instance to pass to the expected conditions

  * @param clock The clock to use when measuring the timeout

  * @param sleeper Object used to make the current thread go to sleep.

  * @param timeOutInSeconds The timeout in seconds when an expectation is

  * @param sleepTimeOut The timeout used whilst sleeping. Defaults to 500ms called.

  */

  public AndroidDriverWait(AndroidDriver driver, Clock clock, Sleeper sleeper, long timeOutInSeconds,

  long sleepTimeOut) {

  super(driver, clock, sleeper);

  withTimeout(timeOutInSeconds, TimeUnit.SECONDS);

  pollingEvery(sleepTimeOut, TimeUnit.MILLISECONDS);

  ignoring(NotFoundException.class);

  this.driver = driver;

  }

  @Override

  protected RuntimeException timeoutException(String message, Throwable lastException) {

  TimeoutException ex = new TimeoutException(message, lastException);

  ex.addInfo(WebDriverException.DRIVER_INFO, driver.getClass().getName());

  if (driver instanceof RemoteWebDriver) {

  RemoteWebDriver remote = (RemoteWebDriver) driver;

  if (remote.getSessionId() != null) {

  ex.addInfo(WebDriverException.SESSION_ID, remote.getSessionId().toString());

  }

  if (remote.getCapabilities() != null) {

  ex.addInfo("Capabilities", remote.getCapabilities().toString());

  }

  }

  throw ex;

  }

  }

  接着需要修改接口:ExpectedCondition,将其WebDriver的类型替换为AndroidDriver

  public interface ExpectedConditionextends Function{}

  经过修改之后,就可以在appium中直接使用:

  //wait for 60s if WebElemnt show up less than 60s , then return , until 60s

  WebElement showClose = new AndroidDriverWait(driver, 60)

  .until(new ExpectedCondition() {

  public WebElement apply(AndroidDriver d) {

  return d.findElement(By

  .id("com.zhihu.android:id/showcase_close"));

  }

  });

  以上内容为大家介绍了自动化测试中的appium三种等待元素的方法,本文由多测师亲自撰写,希望对大家有所帮助。了解更多自动化测试相关知识:https://www.aichudan.com/xwzx/

联系电话

17727591462

返回顶部