【问题标题】:Why webdriver waits longer than defined time on implicit wait?为什么 webdriver 在隐式等待中等待的时间比定义的时间长?
【发布时间】:2019-03-20 00:14:49
【问题描述】:

我正在开设一门关于使用 Java 中的 selenium/web 驱动程序进行自动化/测试的新课程。 出于测试目的,我们有一个 Python Web 应用程序(使用烧瓶),它只是一个虚构博客的条目/帖子的基本 CRUD。

在解释隐式和显式等待期间,示例是插入一个新条目并使用隐式等待等待成功消息。 鉴于烧瓶应用程序在本地运行,它不足以测试等待。因此,教授在响应方法中放置了一个“time.sleep()”,因此返回消息可能需要更长的时间。

这是响应方法的摘录:

elapsed_time=randint(10,12)
time.sleep(elapsed_time)
flash("Entry '" + entry.title + "' created successfully." + str(elapsed_time), "success")

而在我们测试类的setup方法中:

@Before
public void setUp() {
    System.setProperty("webdriver.chrome.driver", "C:\\ChromeDriver\\chromedriver.exe");
    driver = new ChromeDriver();
    driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
    driver.get("localhost:5000");
}

这当然会起作用,因为隐式等待设置为 15 秒,应用程序响应时间不会超过 12 秒。

问题是,如果我将等待设置为 1 秒,它仍然有效,即使我删除了整行,它仍然有效。 (不会抛出找不到元素的错误)

我问教授为什么这没有失败,为什么一直等待超过我设置的隐式等待(1 秒),他不确定。他提到他认为某处有一些默认时间,但没有给我任何精确度。

那么,为什么如果我将隐式等待设置为 1 秒,它在尝试查找消息时不会失败?

我错过了什么?

找到消息的代码是:

    String currentMessage = driver.findElement(By.xpath("/html/body/div[2]/div[1]/div[1]/div/span")).getText();
    System.out.println(currentMessage);

    assertTrue(currentMessage.contains("Entry 'My newest post' created successfully."));

【问题讨论】:

  • 你能粘贴flash方法的代码吗?只是为了确认它正在添加到dom中,而不是简单地让某些东西可见。
  • 您确定您可能不明确的 XPath 表达式不会过早匹配吗?
  • 隐式等待仅在搜索元素时使用。您还必须记住,默认情况下,selenium 会在与页面交互之前尝试加载页面,这将导致(在非常基本的层面上)它等待document.readyState 为真。如果在 document.readyState 设置为 true 时所有元素都已加载到您的页面上,则查找任何元素都不会延迟,因此不需要隐式等待,因此不会出现错误

标签: java selenium webdriver


【解决方案1】:

完全加载您的页面需要多长时间?也许您的页面没有完全加载。尝试将两个等待时间都设置为 1 秒,然后试一试。

  1. 将页面超时设置为 1 秒。

    driver.manage().timeouts().pageLoadTimeout(1, TimeUnit.SECONDS);

  2. 将隐式等待设置为 1 秒。

    driver.manage().timeouts().pageLoadTimeout(1, TimeUnit.SECONDS);

【讨论】:

    猜你喜欢
    • 2021-03-25
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 2022-10-15
    • 2022-11-03
    • 2012-05-11
    • 1970-01-01
    相关资源
    最近更新 更多