Selenium中的几种等待方式
2016-07-04 15:47
531 查看
最近在项目过程中使用selenium 判断元素是否存在的时候 遇到一个很坑爹的问题, 用以下方法执行的时候每次都会等待很长一段时间,原因是因为对selenium实现方法了解不足导致一直找不到解决方法。
隐式等待, 此处的隐式等待是针对Driver 每次执行命令的 最长执行时间也可以理解为超时时间, 一些人对此处有误解,认为是让Driver等一段时间, 确实某些时候能让Driver等一段时间, 但是影响是全局的,每次Driver执行 找不到元素都会等待此处设置的时间, 假设某处将此值设置的太长,必须在执行完成之后还原回来,否则判断一个元素是否存在的时候,就会遇到很坑爹的问题。 改进后的方法如下:WebDriver会进行一个隐式等待,但参数只有时间,这就导致我需要什么元素出现,我不一定能等到它,
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.如:1 new WebDriverWait(driver, 15 ).until( 2 ExpectedConditions.presenceOfElementLocated(By.cssSelector( "css locator" )) 3 );这里,15是要等待的秒数.如果没有满足until()方法中的条件,就会始终在这里wait 15秒,依然找不到,就抛出异常.也可以这样写:
01 WebDriver driver = new FirefoxDriver(); 02 driver.get( www.baidu.com ); 03 WebElement e = ( new WebDriverWait( driver, 10 )) .until( 04 new ExpectedCondition< WebElement>(){ 05 @Override 06 public WebElement apply( WebDriver d) { 07 return d.findElement( By.id( "id locator" )); 08 } 09 } 10 );这样就通过回调函数,直接获得了这个WebElement.也就是页面元素.如果只是仅仅想判断页面是不是加载到某个地方了,就可以用第一种方法; 但如果需要得到某个WebElement,两种方式都可以,只是第一种方式还需要再多一步获取的操作.
1 Wait w = new Wait(){ 2 @Override 3 public boolean until() { 4 return webElement.isDisplayed(); 5 } 6 };另外这种等待的方式,在加载js代码的时候做判断会比较方便,反正我只在代码里这么见过,但是没用过,有兴趣的朋友可以研究一下.
2.隐式等待
1 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.线程休眠
1 Thread.sleep()
相关文章推荐
- 降低项目失败率的三个原则
- jquery设置表单元素为不可用的简单代码
- Ruby 之 class 中的 private、 protected、public
- Ruby定义私有方法(private)的两种办法
- C#实现将数组内元素打乱顺序的方法
- rails创建应用程序实例
- jQuery删除一个元素后淡出效果展示删除过程的方法
- jQuery拖动元素并对元素进行重新排序
- Perl中怎样从数组中删除某个值?
- PHP的数组中提高元素查找与元素去重的效率的技巧解析
- php类中private属性继承问题分析
- 实用jquery操作表单元素的简单代码
- Ruby中的public、private、protected区别小结
- javascript学习笔记(十八) 获得页面中的元素代码
- javascript实现在某个元素上阻止鼠标右键事件的方法和实例
- javascript jquery对form元素的常见操作详解
- jQuery验证元素是否为空的两种常用方法
- JavaScript和jquery获取父级元素、子级元素、兄弟元素的方法
- 使用nodejs开发cli项目实例
- JavaScript实现获取某个元素相邻兄弟节点的prev与next方法