【问题标题】:Selenium implicitlyWait Not Working?Selenium 隐式等待不工作?
【发布时间】:2015-12-22 18:57:51
【问题描述】:

我正在学习 Java Maven Selenium。我想在 Selenium 中使用 implicitlyWait 进行类似的操作。

  1. 打开网站(例如https://www.facebook.com
  2. 点击登录邮箱
  3. 等待 20 秒
  4. 输入我的邮箱

这是我的简单代码:

package com.org.learningMaven;

import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.Test;

public class HelloWorldTest {   
    @Test
    public void login() {
        WebDriver driver = new FirefoxDriver();
        driver.get("https://www.facebook.com/");
        driver.findElement(By.id("email")).click();
        driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
        driver.findElement(By.id("email")).sendKeys("myemail@yahoo.com");
    }
    private void sendKeys(Keys enter) {
        // TODO Auto-generated method stub

    }
}

此代码不起作用。它只会打开 Facebook,点击电子邮件字段并输入我的电子邮件 ID,而不是等待 10 秒钟再输入我的电子邮件。

【问题讨论】:

  • 阅读文档seleniumhq.org/docs/04_webdriver_advanced.jsp#implicit-waits并在我们需要使用它时做出结论:P
  • 你能分享一下为什么你需要等待特定的时间吗?在这种特殊情况下,这对我来说没有意义。
  • 你是对的,在这里使用等待没有意义,我只是做了一个简单的例子来轻松理解这个过程。 :)
  • 很好,欢迎来到 SO,gooood 眼睛:P
  • & 我正试图在我的 Facebook 时间线上发帖。如果我在那里发布链接google.com,那么我将等待 10 秒以加载链接缩略图,然后再单击发布按钮。 &我想我的下一个问题将是如何单击发布按钮,使用 TAB 键到达发布按钮不是一个好方法,很难知道我应该按多少次 TAB 键来聚焦 POST 按钮:P 和.... ……眼睛……?谢谢

标签: java selenium selenium-webdriver


【解决方案1】:

Implicit WaitExplicit Waits 不能这样工作,它们将在指定的持续时间内最大程度地等待元素,如果它们在执行下一步之前找到元素。

如果您希望您的测试等待确切的持续时间,您可能需要使用。

Thread.sleep(Time duration in milliseconds);

您可以参考Diff b/w Implict Wait and Explicit Wait

显式等待:显式等待是您定义的代码,用于等待特定条件发生,然后再继续执行代码。

隐式等待:隐式等待是告诉 WebDriver 在尝试查找一个或多个元素(如果它们不是立即可用的)时轮询 DOM 一段时间。

Thread.sleep :在睡眠代码中它总是会等待提到的秒数,即使页面准备好在 1 秒后进行交互也是如此。所以这会减慢测试速度。

【讨论】:

  • 谢谢,它成功了。我听说 Thread.sleep();不是一件好事,我不知道为什么它不好,但它对我有用,再次感谢。
  • 但使用Thread.sleep 不是一个好习惯,您应该始终尝试使用Implicit or Explicit Waits
  • 你能告诉我为什么它不好吗?就我而言,我只想在做任何动作之前等待几秒钟,那么睡眠方法会有什么副作用?谢谢
  • 我正在使用 try { Thread.sleep(20000); } catch (InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); }
  • 非常感谢 Drets,我明白了。 :)
【解决方案2】:

Thread.sleep 会在特定时间段内停止执行。这就是为什么不建议在执行脚本中使用 Thread.sleep 的原因。其中隐式/显式等待处理特定的 web 元素。如果脚本发现页面中存在所需的 Web 元素,则脚本继续。如果它没有找到提到的 web 元素,如果在特定等待期的网页中找到该元素。

【讨论】:

    【解决方案3】:

    实现 WebDriverWait

    public void waitForElement(WebDriver driver, WebElement element) {
        WebDriverWait wait = new WebDriverWait(driver,5);
        wait.until(ExpectedConditions.visibilityOf(element));
    
    }
    

    【讨论】:

      【解决方案4】:

      如果一个 web 元素没有显示,而您想等待该元素显示,那么下面的代码将起作用。

      while(true) {
          boolean flag = driver.findElement(By.id("id_name")).isDisplayed();
          if(flag)
              break;
      }
      

      【讨论】:

      • OP 询问只是等待,而不是等待元素。除此之外,如果页面加载时间比默认的隐式等待时间长(我认为是 3 秒),此代码将失败并抛出 TimeoutException。 @Bart Van De Slijcke 的回答是在慢页面上等待元素的正确方法。
      猜你喜欢
      • 2022-06-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2012-08-15
      • 2012-12-08
      • 1970-01-01
      • 2018-03-27
      • 2023-04-08
      相关资源
      最近更新 更多