• Selenium的延迟等待


    http://my.oschina.net/u/928852/blog/98885

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

    1.显式等待

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

    如:

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

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

    也可以这样写:

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    WebDriver driver = new FirefoxDriver();
    driver.get( http://somedomain/url_that_delays_loading);
    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,两种方式都可以,只是第一种方式还需要再多一步获取的操作.

    1
    2
    3
    4
    5
    6
    Wait w = new Wait(){
        @Override
        public boolean until() {
            return webElement.isDisplayed();
        }
    };

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

    2.隐式等待

    隐式等待,我觉得就是不靠谱的等待,看一段代码就明白了.

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

    WebDriver会进行一个隐式等待,但参数只有时间,这就导致我需要什么元素出现,我不一定能等到它,只是让driver延迟一段时间再继续而已. 不过我们也可以把它小小的封装一下,变废为宝:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public boolean isByElementDisplayed(By by, int time) {
        boolean status = false;
        if (driver.findElement(by).isDisplayed() == false) {
            driver.manage().timeouts().implicitlyWait(time, TimeUnit.SECONDS);
        } else {
            status = true;
        }
        return status;
    }

    得不到某个元素,我们就延迟一下...

    最后还有一个最低效的做法:

    1
    Thread.sleep()

    额,不建议使用.

    第一次发文,大家多提意见.

  • 相关阅读:
    "无法在证书存储区中找到清单签名证书"的解决办法
    Windows消息ID说明
    ToolBar来的是什么事. (ToolBar 难见的Bug)
    SQL Tips 收集常用的SQL
    郁闷的内存泄露,增加TmfEditFormCmptMgr.OnDstMainSetFieldData惹的祸
    FormDestroy和Destroy中选其一个使用.
    一步步教你优化Delphi字串查找(转载)
    利用SQL建立数据库对象
    数据字典ChangeName引发的问题.
    测试Live Writer
  • 原文地址:https://www.cnblogs.com/201dom/p/5166779.html
Copyright © 2020-2023  润新知