首页 > 代码库 > 定位元素的等待方法

定位元素的等待方法

1、显式等待:
public static void waitForLoad(WebDriver driver, final By locator, int timeOut) {
     WebDriverWait wait = new WebDriverWait(driver, timeOut);  // timeOut为等待时间,单位秒
      wait.until(new ExpectedCondition<Boolean>() {
          public Boolean apply(WebDriver d) {
               boolean loadcomplete = d.findElement(locator).isDisplayed();
               return loadcomplete;
          }
    });
}
newWebDriverWait(driver,10).until(
ExpectedConditions.presenceOfElementLocated(By.cssSelector("css locator")));
原理:显式等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么就跳出Exception.(简而言之:就是直到元素出现才去操作,如果超时则报异常)
改进后方法:
WebElementelementId=(newWebDriverWait(driver,10)).until(
new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver d){
return d.findElement( By.id("id locator"));
}
}
);
 
2、隐式等待:
driver.manage().timeouts().implicitlyWait(second, TimeUnit.SECONDS); //second为等待时间,单位秒
针对Driver 每次执行命令的最长执行时间,也可以理解为超时时间。但参数只有时间,这就导致我需要什么元素出现,我不一定能等到它。

原理:隐式等待,就是在创建driver时,为浏览器对象设置一个等待时间。这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。
注:此处设置的等待时间 是针对全局设置的,webdriver中执行所有命令的超时时间都设置为second秒了

注:在使用隐式等待的时候,实际上浏览器会在你自己设定的时间内不断的刷新页面去寻找我们需要的元素

改进后方法:
  private boolean isElementPresent(By by) { 
      try { 
           driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS); 
           driver.findElement(by); 
           return true; 
        } catch (NoSuchElementException e) { 
          return false; 
       } 
  }
 
显式与隐式的区别:
显示等待是针对某个元素的等待相当于局部的,隐身等待是针对driver实例来的相当于是全局的。一般情况使用显示等待。
 
3、线程休眠:
Thread.sleep(3000); //线程停止3秒
使当前线程进入等待,Thread.sleep();这种等待属于死等,会强制等待一段时间,很容易让线程挂掉,使程序抛异常,不建议使用,影响自动化执行效率。所以我们要慎用此方法,适用于无法识别控件的情况下。

 

定位元素的等待方法