我最近将我的 Selenium 自动化项目从 .Net Framework 4.8.1 迁移到 .Net 6.0,并注意到测试执行时间发生了显着变化。他们变得更慢了。对于一个 TestFixture,持续时间从 26 分钟增加到 56 分钟。
我在互联网上搜索这个问题,发现了这篇文章:GitHub - HttpWebRequest在Win10上解析http://localhost时遇到1秒超时(.NET Framework很快)这是一些用户在针对http运行Selenium时遇到的问题//本地主机/。 我没有使用本地主机。整个测试框架绑定到 Azure 上托管的临时环境的 URL。
条件相同:代码、所有 NuGet 包均已更新、暂存环境相同等。对项目进行分析显示,WebDriver 请求平均慢 2-5 倍。
我正在使用 WebElement 的包装类来处理异常和显式等待,下面是 Click() 方法的示例。如果您查看有关执行时间的注释,您会注意到 .Net 6.0 在使用 WebDriverWait 时特别慢:
public bool Click(Driver driver)
{
InitWait(driver); //.NET - 415ms, Framework - 28ms
_log.Debug($"Trying to click {_locator}");
try
{
el = wait.Until(ExpectedConditions.ElementToBeClickable(_locator)); //.NET - 266ms, Framework - 20ms
el.Click(); //.NET - 49ms, Framework - 39ms
return true;
}
catch (Exception e)
{
if (e is ElementClickInterceptedException)
{
ScrollToElementJS(driver);
el.Click();
return true;
}
else
{
Fail($"Can't click element '{_locator}'", e);
throw;
}
}
}
private protected void InitWait(Driver driver, int seconds = 30)
{
if (wait == null)
wait = new WebDriverWait(driver.webDriverInstance, TimeSpan.FromSeconds(seconds));
else
wait.Timeout = TimeSpan.FromSeconds(seconds);
wait.IgnoreExceptionTypes(typeof(NoSuchElementException), typeof(StaleElementReferenceException));
WaitUntilLoadingCompletes(driver); //.NET - 307ms, Framework - 90ms
}
public void WaitUntilLoadingCompletes(Driver driver)
{
var wait = new WebDriverWait(driver.webDriverInstance, _thirty);
wait.IgnoreExceptionTypes(typeof(NoSuchElementException), typeof(StaleElementReferenceException));
Element spinner = new Element(By.XPath(Config.spinnerXPath));
Element spinnerBar = new Element(By.XPath("//div[@id='loading-bar']"));
Element divOverlay = new Element(By.XPath("//div[@class='overlay']"));
try
{
wait.Until(ExpectedConditions.InvisibilityOfElementLocated(spinner._locator)); //.NET - 124ms, Framework - 20ms
wait.Until(ExpectedConditions.InvisibilityOfElementLocated(spinnerBar._locator)); //.NET - 97ms, Framework - 10ms
wait.Until(ExpectedConditions.InvisibilityOfElementLocated(divOverlay._locator)); //.NET - 102ms, Framework - 55ms
}
catch (Exception e)
{
Fail($"One of the loaders at '{_locator}' is visible after {wait.Timeout.ToPrettyFormat()}", e);
}
}
<PackageReference Include="DotNetSeleniumExtras.WaitHelpers" Version="3.11.0" />
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="NUnit" Version="3.13.3" />
<PackageReference Include="NUnit.ConsoleRunner" Version="3.16.3" />
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.3" />
<PackageReference Include="Selenium.Support" Version="4.11.0" />
<PackageReference Include="Selenium.WebDriver" Version="4.11.0" />
<PackageReference Include="WebDriverManager" Version="2.17.0" />
将框架更改为 dotnet core 时我也遇到同样的问题