我正在阅读SeleniumHQ文档,并遇到以下声明。
“警告:不要混合使用隐式等待和显式等待。这样做可能会导致不可预知的等待时间。例如,将隐式等待设置为10s,将显式等待设置为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();
}
}
}
时间以秒为单位: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();
}
}
}
时间以秒为单位: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();
}
}
}
时间以秒为单位:00:00:20.5771817
我的问题与那些等待的执行无关。这完全与文档中的语句和超时计算有关。
但是您必须知道如何实现它们才能理解正在发生的事情。这是两种类型的等待混合使用时发生的情况。我正在跳过对讨论不重要的那些步骤。
您的脚本设置了一个隐式等待。
您的脚本会开始显式等待,以检查元素是否存在。显式等待 通过轮询进行 。因此,它将命令发送到浏览器以检查元素的存在。
由于已经设置了隐式等待,发送给浏览器的命令需要10秒钟才能返回失败。
您的显式等待将检查它是否已达到其15s的时间限制。当前等待时间为10秒(加上执行脚本,网络延迟等所需的时间极少),少于15秒。因此,它没有等待完成,而是重新发出与上述步骤2中相同的命令。
由于隐式等待,发送到浏览器的命令需要10秒钟才能返回失败。
当显式等待再次检查其自身的超时时,已经超过15秒,因此超时。
因此,显式等待将轮询两次,每次都需要10秒,这意味着总共需要20秒(加上很少的时间来记账)。
显式等待不执行任何操作来检测和补偿已设置的隐式等待。而且,它不会继续与发送给浏览器的命令并行运行。在执行浏览器命令时,显式等待不会执行任何簿记操作或无法超时。它必须等待浏览器命令完成才能检查它是否应该超时。
我如何用一个显式的替换这个隐式的等待呢? driver=新ChromeDriver(功能); driver.manage().DeleteAllCookies();
问题内容: 我在使用Hibernate生成无效SQL时遇到问题。具体来说,混合和匹配隐式和显式联接。这似乎是一个开放的错误。 但是,我不确定 为什么 这是无效的SQL。我想出了一个生成相同语法异常的小型玩具示例。 架构图 数据 工作SQL 这两个查询均有效。我意识到有笛卡尔积;那是故意的。 明确加入: 隐式加入: 无效的SQL 此查询不适用于MSSQL 2000/2008或MySQL: 在MS20
问题内容: 我在用: 但是对于以下元素它仍然连续失败 我添加了等待代码: 隐式等待是否应该等到找到一个元素后再进行处理?如果我使用而不是我添加的代码,还会更好吗? 问题答案: TL; DR:始终使用显式等待。忘记隐式等待的存在。 以下是显式等待与隐式等待之间的区别的简要概述: 显式等待: 记录和定义的行为。 在硒的本地部分运行(以你的代码语言显示)。 可以在你能想到的任何条件下工作。 返回成功或超
问题内容: Selenium WebDriver中有隐式和显式等待。它们之间有什么区别? 请分享有关Selenium WebDriver的知识。请显示带有隐式和显式等待的实时示例。 问题答案: 检查以下链接: -通过轮询DOM来指示Web驱动程序等待一段时间。声明隐式等待后,它将在Web驱动程序实例的整个生命周期中都可用。默认情况下,该值将为0。如果设置了更长的默认值,则该行为将根据浏览器/驱动程
我正在尝试自动化基于共享点的应用程序,它有时会很慢。在下面的示例中,我试图将密码输入包装成显式等待。目前,Selenium以快速运行测试,导致无法执行操作。 如何将密码部分包装成硒显式方式?
问题内容: 我是初学者。我了解基本等待的内容,但是我对互联网上的不同教程如何放置并进行解释感到困惑。例如,在下面的代码中,将其放置在加载URL之前。因此,是否只是等待URL加载或查找元素或两者兼而有之?的确,如果我在try块中使用一次隐式等待,它是否适用于我在代码中执行的每个元素搜索? 问题答案: 隐式等待 ImplicitWait按照该Java文档是指定的时间量 webdriver的 情况下,即