.NET 6.0 上的 Selenium 比 .NET Framework 4.8.1 慢

问题描述 投票:0回答:1

问题

我最近将我的 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 倍

.Net Framework 项目的一些测试的持续时间:

.Net 6.0 几乎慢了一倍:

.NET 分析

我正在使用 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" />
c# .net selenium-webdriver automated-tests .net-4.8
1个回答
0
投票

将框架更改为 dotnet core 时我也遇到同样的问题

© www.soinside.com 2019 - 2024. All rights reserved.