【问题标题】:Does implicit wait in selenium, only used for element search?selenium 中是否隐式等待,仅用于元素搜索?
【发布时间】:2015-04-12 15:24:16
【问题描述】:

我想了解 selenium 中隐式等待的用法。

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

它会仅用于元素搜索还是用于页面加载和刷新等任何其他目的?像往常一样,我在驱动程序初始化的开始使用它。

但在我的应用程序中,我想在输入错误密码后检查错误消息,但是一旦我输入错误密码,它就会离开页面并且不会在同一页面上等待错误消息。它只会初始化/加载页面一次吗?当我使用 Thread.sleep(3) 时,它会在页面上停止 3 秒,并正确读取错误消息。

但我不想使用 Thread.sleep,因为我已经在使用隐式等待了。

谁能告诉我它的用途以及如何解决这个错误?

下面的代码片段:(不工作,返回失败) (无 Thread.sleep)

 setText(WebElements.TEXT_BOX, PASSWORD);
    click(WebElements.SUBMIT_BUTTON);
           //Thread.sleep(3000);
            if (isElementPresent(WebElements.ERROR_MESSAGE)) {
                          return SUCCESS;
      }
            else 
                    return FAILURE;

【问题讨论】:

    标签: java unit-testing selenium testng load-testing


    【解决方案1】:

    ImplicitExplicit 等待之间的主要区别在于,Implicit 等待轮询 DOM 一段定义的时间(比如说10s) 并查找元素,而显式等待会定期将请求发送到服务器并检查 DOM 中的元素。

    隐式等待是固定的并且固定到驱动程序实例。因此,一旦您设置了该时间,它将为整个驱动程序实例设置并应用到任何地方。有了这个,当你使用任何命令来查找元素时,它会在定义的时间内轮询 DOM,不定期与服务器交谈/发送另一个请求,如果没有找到,最后抛出异常。

    另一方面,显式等待有一个 500 毫秒的 default time 在其中休眠,除非您明确覆盖它。这意味着它在间隔之间充当 Thread.sleep(); 并休眠 500 毫秒,然后将请求发送到服务器并定期检查您定义的元素和条件,其中定义了轮询间隔并达到超时。

    因此,在您的情况下,Thread.Sleep() 正在显式等待。正确的解决方案当然是使用 Explicit 等待并定期检查元素及其预期条件。

    setText(WebElements.TEXT_BOX, PASSWORD);
    WebDriverWait wait = new WebDriverWait(driver,10);
    
    try{
    
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("id of the element to be located")));
        return SUCCESS;
    }
    catch (NoSuchElementException exception)
    {
        return FAILURE;
    }
    

    【讨论】:

      【解决方案2】:

      首先你做一些点击。然后页面更改。在调用 isElementPresent() 之前,如何知道页面是否已经加载?

      最好不要使用implicitlyWait() 而不是sleep()。使用 FluentWait: https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/ui/FluentWait.html

      FluentWait 会定期检查您的条件是否为“真”。如果没有(例如,如果页面尚未完全加载),请等待一段时间并再次检查。

      【讨论】:

        【解决方案3】:

        我会建议你使用下面给出的显式等待

        int wait = 10;
        WebDriverWait WAIT = new WebDriverWait(driver,wait);
        try{
            WAIT.until(ExpectedConditions.presenceOfElementLocated(By.id("id of element")));
            return SUCCESS;
        }
        catch (NoSuchElementException exception)
        {
            return FAILURE;
        }
        

        隐式、显式和流利之间的区别等等你可以找到here

        【讨论】:

          猜你喜欢
          • 2020-04-17
          • 2014-05-07
          • 2022-01-16
          • 2016-01-02
          • 1970-01-01
          • 2023-04-08
          • 1970-01-01
          • 1970-01-01
          • 2017-04-29
          相关资源
          最近更新 更多