摘:http://blog.csdn.net/pf20050904/article/details/20052485

最近在项目过程中使用selenium 判断元素是否存在的时候 遇到一个很坑爹的问题, 用以下方法执行的时候每次都会等待很长一段时间,原因是因为对selenium实现方法了解不足导致一直找不到解决方法。

private boolean isElementPresent(By by) {
    try {

driver.findElement(by);
      return true;
    } catch (NoSuchElementException e) {
      return false; 
    }
  }

不明所以, 经过追踪源码才发现启动Driver的时候 使用driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 此处设置的等待时间 是针对全局设置的,webdriver中执行所有命令 的超时时间都设置为30秒了, 如上面的findElement方法,找不到元素会默认等待三十秒。  有些时候只需简单判断元素是否存在,立马执行,而此处的设置导致 脚本执行缓慢。  将Selenium中的等待时间贴出来给大家张张经验。

Selenium的延迟等待分为 显式等待(Explicit Wait) & 隐式等待(Implicit Wait).

1.显式等待

显式等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么就跳出Exception.

如:

new WebDriverWait(driver, 15).until(
    ExpectedConditions.presenceOfElementLocated(By.cssSelector("css locator"))
);

这里,15是要等待的秒数.如果没有满足until()方法中的条件,就会始终在这里wait 15秒,依然找不到,就抛出异常.

也可以这样写:

WebDriver driver = new FirefoxDriver();
driver.get( www.baidu.com);
WebElement e = (new WebDriverWait( driver, 10)) .until(
    new ExpectedCondition< WebElement>(){
        @Override
        public WebElement apply( WebDriver d) {
            return d.findElement( By.id("id locator"));
        }
    }
);

这样就通过回调函数,直接获得了这个WebElement.也就是页面元素.

如果只是仅仅想判断页面是不是加载到某个地方了,就可以用第一种方法; 但如果需要得到某个WebElement,两种方式都可以,只是第一种方式还需要再多一步获取的操作.

Wait w = new Wait(){
    @Override
    public boolean until() {
        return webElement.isDisplayed();
    }
};

另外这种等待的方式,在加载js代码的时候做判断会比较方便,反正我只在代码里这么见过,但是没用过,有兴趣的朋友可以研究一下.

2.隐式等待

driver.manage().timeouts().implicitlyWait(second, TimeUnit.SECONDS);

隐式等待, 此处的隐式等待是针对Driver 每次执行命令的 最长执行时间也可以理解为超时时间,  一些人对此处有误解,认为是让Driver等一段时间,  确实某些时候能让Driver等一段时间, 但是影响是全局的,每次Driver执行 找不到元素都会等待此处设置的时间,  假设某处将此值设置的太长,必须在执行完成之后还原回来,否则判断一个元素是否存在的时候,就会遇到很坑爹的问题。   改进后的方法如下:

WebDriver会进行一个隐式等待,但参数只有时间,这就导致我需要什么元素出现,我不一定能等到它,

  private boolean isElementPresent(By by) {
    try {
      driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
      driver.findElement(by);
      return true;
    } catch (NoSuchElementException e) {
      return false; 
    }
  }
 
得不到某个元素,我们就延迟一下...

3.线程休眠

Thread.sleep()

最新文章

  1. 【数据库】_由2000W多条开房数据引发的思考、实践----给在校生的一个真实【练耙场】,同学们,来开始一次伟大的尝试吧。
  2. Javascript的自执行函数
  3. alter system switch logfile与alter system archive log current的区别
  4. Windows Phone 8.1中处理后退键的HardwareButtons.BackPressed事件
  5. Unity3D引擎扩展中的编辑器定制方法
  6. Docker —— 用于统一开发和部署的轻量级 Linux 容器【转】
  7. HDU5764 After a Sleepless Night 树形乱搞题
  8. IOS面试题(虽然我们很少用)
  9. eclipse打包 jar文件,中文乱码解决方案
  10. 求模和求余(附加C语言实现)
  11. NET Core 1.0
  12. Python系列之Collections内置模块(2)
  13. Oracle绝对秒数转换为时间戳
  14. maven eclipse web 项目 问题 cannot change version of project facet dynamic web module to 3.0
  15. 解决git反复输入密码的问题
  16. 线性代数导论 | Linear Algebra 课程
  17. 小程序——Tab切换
  18. Python文件打包成exe
  19. Vue实现用户自定义上传头像裁剪
  20. js_原生js实现上拉加载更多的功能。

热门文章

  1. sql server 分页存储过程
  2. opencv单目摄像机标定
  3. 使用spring配置quartz定时器
  4. Java 基础之-枚举
  5. JVM常量池
  6. 在Sublime Text3上面更加方便愉快的写php
  7. 学霸网站---Alpha+版本测试报告
  8. Spring 4 官方文档学习(十三)集成其他web框架
  9. CPU虚拟化的常见技术
  10. android sdk镜像站点