appium三种等待元素的方法

发表于:2018-8-15 14:19

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Timo和小蘑菇    来源:CSDN

  学过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<WebElement>() {
  @Override
  public WebElement apply(WebDriver d) {
  return d.findElement(By.id("q"));
  }
  })

  以上三种方法中,只用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<AndroidDriver> {
  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 ExpectedCondition<T> extends Function<AndroidDriver, T> {}
  经过修改之后,就可以在appium中直接使用:
  //wait for 60s if WebElemnt show up less than 60s , then return , until 60s
  WebElement showClose = new AndroidDriverWait(driver, 60)
  .until(new ExpectedCondition<WebElement>() {
  public WebElement apply(AndroidDriver d) {
  return d.findElement(By
  .id("com.zhihu.android:id/showcase_close"));
  }
  });

 上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号