gpt4 book ai didi

selenium - 澄清 Selenium 文档中混合隐式和显式等待的原因

转载 作者:行者123 更新时间:2023-12-02 14:58:45 26 4
gpt4 key购买 nike

我正在阅读SeleniumHQ文档并发现以下陈述。

“警告:不要混合隐式和显式等待。这样做可能会导致不可预测的等待时间。例如,设置 10 秒的隐式等待和 15 秒的显式等待,可能会导致 20 秒后发生超时.”

出于某种原因,我无法理解这一点。总超时 20 秒是我的主要困惑点。谁能解释一下我是否遗漏了什么?

编辑

我的问题不是关于混合这些等待的实现/后果。完全是关于文档上超时的陈述和计算。

第二次编辑

根据以下测试,该文档似乎是正确的。 不过我仍然需要解释

只是隐式等待

using System;
using System.Diagnostics;
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

namespace Test
{
[TestFixture]
public class Test
{
private IWebDriver _webDriver;

[Test]
public void ExplicitVsImplicitWaitTest()
{
_webDriver = new ChromeDriver();
_webDriver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
_webDriver.Navigate().GoToUrl("https://www.google.com/");
_webDriver.Manage().Window.Maximize();

Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();

try
{
//new WebDriverWait(_webDriver, TimeSpan.FromSeconds(15)).Until(
//ExpectedConditions.ElementExists(By.CssSelector("Should Fail")));
_webDriver.FindElement(By.CssSelector("Should Fail"));
}
catch ( NoSuchElementException exception)
//catch ( OpenQA.Selenium.WebDriverTimeoutException)
{
stopwatch.Stop();
Console.WriteLine(stopwatch.Elapsed);
}

_webDriver.Quit();

}
}
}

Time in second: 00:00:10.0167290

只是显式等待

using System;
using System.Diagnostics;
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;

namespace Test
{
[TestFixture]
public class Test
{
private IWebDriver _webDriver;

[Test]
public void ExplicitVsImplicitWaitTest()
{
_webDriver = new ChromeDriver();
//_webDriver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
_webDriver.Navigate().GoToUrl("https://www.google.com/");
_webDriver.Manage().Window.Maximize();

Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();

try
{
new WebDriverWait(_webDriver, TimeSpan.FromSeconds(15)).Until(
ExpectedConditions.ElementExists(By.CssSelector("Should Fail")));
_webDriver.FindElement(By.CssSelector("Should Fail"));
}
//catch ( NoSuchElementException exception)
catch ( OpenQA.Selenium.WebDriverTimeoutException)
{
stopwatch.Stop();
Console.WriteLine(stopwatch.Elapsed);
}

_webDriver.Quit();

}
}
}

Time in second: 00:00:15.2463079

混合、显式和隐式两者

using System;
using System.Diagnostics;
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;

namespace Test
{
[TestFixture]
public class Test
{
private IWebDriver _webDriver;

[Test]
public void ExplicitVsImplicitWaitTest()
{
_webDriver = new ChromeDriver();
_webDriver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
_webDriver.Navigate().GoToUrl("https://www.google.com/");
_webDriver.Manage().Window.Maximize();

Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();

try
{
new WebDriverWait(_webDriver, TimeSpan.FromSeconds(15)).Until(
ExpectedConditions.ElementExists(By.CssSelector("Should Fail")));
_webDriver.FindElement(By.CssSelector("Should Fail"));
}
//catch ( NoSuchElementException exception)
catch ( OpenQA.Selenium.WebDriverTimeoutException)
{
stopwatch.Stop();
Console.WriteLine(stopwatch.Elapsed);
}

_webDriver.Quit();

}
}
}

Time in second: 00:00:20.5771817

最佳答案

My question is not about the implementation of those waits. It's entirely about the statements and calculation of timeout on the doc.

但是您必须知道它们是如何实现的才能理解正在发生的事情。以下是两种等待类型的混合所发生的情况。我将跳过那些对讨论不重要的步骤。

  1. 您的脚本设置隐式等待。

  2. 您的脚本启动显式等待,检查该元素是否存在。显式等待通过轮询实现。因此它向浏览器发送一个命令来检查该元素是否存在。

  3. 由于已设置隐式等待,发送到浏览器的命令需要 10 秒才能返回失败。

  4. 您的显式等待会检查是否已达到 15 秒的时间限制。目前等待时间为 10 秒(加上执行脚本所需的少量时间、网络延迟等),不到 15 秒。因此,它不会等待并重新发出与上面步骤 2 中相同的命令。

  5. 由于隐式等待,发送到浏览器的命令需要 10 秒才能返回失败。

  6. 当显式等待再次检查自身超时时,已经超过 15 秒,因此超时。

因此,显式等待轮询两次,每次需要 10 秒,这意味着总共 20 秒(加上用于记账的少量时间)。

显式等待不会执行任何操作来检测和补偿已设置的隐式等待。并且它不会继续与发送到浏览器的命令并行运行。当浏览器命令执行时,显式等待不会执行任何记录或能够超时。它必须等待浏览器命令完成才能检查是否超时。

关于selenium - 澄清 Selenium 文档中混合隐式和显式等待的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29474296/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com