【问题标题】:Can I use WebDriverWait without an ExpectedCondition in Selenium through Java?我可以通过 Java 在 Selenium 中使用没有 ExpectedCondition 的 WebDriverWait 吗?
【发布时间】:2019-02-27 17:24:42
【问题描述】:

我有一个项目正在使用 Cucumber/Selenium 进行前端测试。我被告知使用 WebDriverWait 而不是 Thread.sleep() 来完成测试。但是,在这种情况下,我不是在寻找预期的条件。我确实需要在页面加载时暂停测试。如果它在等待之前搜索 xPath,它将单击搜索中的第一项并继续测试错误的内容。

【问题讨论】:

    标签: java selenium lambda pageload webdriverwait


    【解决方案1】:

    为什么需要暂停游览测试?

    如果您需要等待 untli 元素可见,请使用:new WebDriverWait(WebDriver driver, String timeToWait).until(ExpectedConditions.visibilityOf(WebElement element));

    如果您需要等待 untli 元素可点击使用:new WebDriverWait(WebDriver driver, String timeToWait).until(ExpectedConditions.elementToBeClickable(WebElement element));

    如果您需要等待 untli 元素出现在 DOM 上,请使用:webDriver.manage().timeouts().implicitlyWait(String timeToWait, TimeUnit.SECONDS);

    使用 Thread.sleep() 或将测试暂停指定时间是一种不好的做法。

    【讨论】:

      【解决方案2】:

      如果您打算在不使用任何ExpectedConditions 的情况下使用WebDriverWait,而您需要在页面加载时暂停测试,您也可以使用Java lambda 表达式,如下所示:

      new WebDriverWait(driver, 20)
              .until(d -> ((JavascriptExecutor)d).executeScript("return document.readyState")
                  .equals("complete"));
      

      【讨论】:

        【解决方案3】:

        在 Java + Selenium 中使用以下方法

        public boolean  isPageReady(WebDriver driver){
           boolean readyStateComplete = false;
            while (!readyStateComplete){
                JavascriptExecutor executor = (JavascriptExecutor) driver;
                readyStateComplete = executor.executeScript("return document.readyState").equals("complete");
            }
            return  readyStateComplete;
        }
        

        对于 C# + Selenium

        private void WaitUntilDocumentIsReady(TimeSpan timeout){
            var javaScriptExecutor = WebDriver as IJavaScriptExecutor;
            var wait = new WebDriverWait(WebDriver, timeout);
        
            // Check if document is ready
            Func<IWebDriver, bool> readyCondition = webDriver => javaScriptExecutor
                    .ExecuteScript("return (document.readyState == 'complete' && jQuery.active == 0)");
            wait.Until(readyCondition);
        }
        

        【讨论】:

          猜你喜欢
          • 2018-09-11
          • 2019-08-26
          • 2020-10-26
          • 2020-11-06
          • 2011-08-03
          • 1970-01-01
          • 1970-01-01
          • 2015-09-29
          • 1970-01-01
          相关资源
          最近更新 更多