瑞客论坛

 找回密码
 立即注册
查看: 1103|回复: 1

申请会员ID:fuzhoulx【未通过】

[复制链接]
匿名  发表于 2020-11-9 23:06 |阅读模式
1、申 请 I D:fuzhoulx
2、个人邮箱:fuzhouliuxin@163.com
3、原创技术文章:
Selenium中的几种等待方式

Selenium中的几种等待方式

最近在项目过程中使用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()

回复

使用道具

金币5184  第242名

21

主题

424

回帖

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

威望
8508
贡献
7393
热心值
350
金币
5184
注册时间
2019-3-15
发表于 2020-11-11 16:49 | 显示全部楼层
您好,请发原创文章。或者提供这是您首发的证明。

这个在网上一搜索都是:https://4m.cn/6W30z
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

Archiver|手机版|小黑屋|瑞客论坛 |网站地图

GMT+8, 2024-11-21 23:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表