元素的多种延时等待(&页面的超时处理)

有时候页面元素不是当下就出现的,这个时候就需要等待元素出现后再继续后面的操作了。

/**

* 1. 线程休眠---Thread.sleep(long millis);

* 强制等待,硬性等待--不确定具体需要等待多久时间的时候,容易造成时间的浪费

* 例子:Thread.sleep(2000);

* 2. 隐式等待---TimeOuts--implicitlyWait

* 设置方式:driver.manage.timeouts().implictlyWait(long time,TimeUnit unit)

* 例子:driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);

* 特点:相对灵活(优),设置是针对全局的,在WebDriver实例整个生命周期有效,但并不是所有元素都需要等待(缺)

* 3. 显式等待--可以自己指定某个元素需要等待(在有必要进行等待的时候再执行等待)

* 每隔0.5秒扫描一次页面,检查元素是否满足等待结果条件,比如查找元素,则检查元素是否存在,存在的话返回true,不存在则继续等待,知道找到或超时。

* 特点:不是针对全局的,只有需要进行等待的元素才执行等待,可以自己设置场景(条件),条件满足时再继续执行

*/

显式等待的代码如下:

/**

* 智能查找元素方法,设置任意等待时间

* @param by

* @param timeOutInSeconds

* @return

*/

public WebElement getElement(By by,long timeOutInSeconds) {

  WebDriverWait wait=new WebDriverWait(driver, timeOutInSeconds);

  WebElement element=wait.until(new ExpectedCondition<WebElement>() {

    public WebElement apply(WebDriver driver) {

      return driver.findElement(by);

    }

   });

  return element;

  }

/**

* 智能查找元素方法,设定等待时间为5s

* @param by

* @return

*/

public WebElement getElement(By by) {

  return getElement(by,5);

}

PS: 有时对于页面加载时间有要求时,需要处理一下超时时页面仍位加载完成的情况:

public void f(){

  try {

  //页面超时3s,需要设置在get请求之前

  driver.manage().timeouts().pageLoadTimeout(3, TimeUnit.SECONDS); 

  driver.get("https://docs.seleniumhq.org/download/");

  //get:需要等待网页的所有请求全部加载完毕,才会进行下一步的操作:当前页面资源,异步请求(其他站点)

  } catch (ImeNotAvailableException e) {

    System.out.println("页面加载超时,提bug");

    //超时后仍想后续的操作--让页面停止加载继续后面的操作,可以提高脚本的执行效率

    //js执行器让页面停止加载

    JavascriptExecutor javascriptExecutor=(JavascriptExecutor) driver;

    javascriptExecutor.executeScript("window.stop()");

    }

  getElement(By.id("q")).sendKeys("driver");

  }

posted @ 2018-11-17 23:44  本仙女不一样  阅读(786)  评论(1编辑  收藏  举报