无法从程序集 'WebDriver, Version=4.0.0.0, Culture=neutral, PublicKeyToken=null' 加载类型 'OpenQA.Selenium.Internal.IWrapsElement'

Could not load type 'OpenQA.Selenium.Internal.IWrapsElement' from assembly 'WebDriver, Version=4.0.0.0, Culture=neutral, PublicKeyToken=null'

我正在使用 C# 使用 selenium 和 specflow 创建自动化测试。今天我不得不将 Selenium.WebDriver 更新到版本 4.0.0-beta4,因为日志记录功能在以前的版本中有一个错误 AvailableLogTypes 属性,它总是抛出空引用异常。 更新到 selenium 4 后,出现了另一个问题。构建工作正常,没有错误或警告,但是当我 运行 测试时,抛出以下异常:

Message: 
    System.TypeLoadException : Could not load type 'OpenQA.Selenium.Internal.IWrapsElement' from assembly 'WebDriver, Version=4.0.0.0, Culture=neutral, PublicKeyToken=null'.

Stack Trace: 
    DefaultPageObjectMemberDecorator.CreateProxyObject(Type memberType, IElementLocator locator, IEnumerable`1 bys, Boolean cache)
    DefaultPageObjectMemberDecorator.Decorate(MemberInfo member, IElementLocator locator)
    PageFactory.InitElements(Object page, IElementLocator locator, IPageObjectMemberDecorator decorator)
    PageFactory.InitElements(Object page, IElementLocator locator)
    PageFactory.InitElements(ISearchContext driver, Object page)
    LoginPageElements.ctor(IWebDriver driver) line 12
    PortalSharedPageSteps.CheckUIElementsOfLoginScreen() line 32
    LoginPageTestSteps.CheckUIElementsOfLoginScreenStep() line 21
    BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration)
    TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments, TimeSpan& duration)
    TestExecutionEngine.ExecuteStep(IContextManager contextManager, StepInstance stepInstance)
    TestExecutionEngine.OnAfterLastStep()
    TestRunner.CollectScenarioErrors()
    LoginPageTestFeature.ScenarioCleanup()
    LoginPageTestFeature.LoginPageTest() line 9

来自selenium的官方发行说明:

Per v4.0.0a1 in https://github.com/SeleniumHQ/selenium/blob/master/dotnet/CHANGELOG "Moved IWrapsDriver and IWrapsElement from the OpenQA.Selenium.Internal namespace to the OpenQA.Selenium namespace. This should be a no-op for the vast majority of users, requiring only a recompile of code, given that both of these interfaces feature return types in the base namespace, meaning that users likely already have "using" statements for the root namespace in their source. If errors are encountered, changing the namespace in the code and rebuilding should resolve the error."

我仔细检查了所有出现的 OpenQA.Selenium.Internal 命名空间,发现我的代码中甚至没有使用这个命名空间。所以我认为一切都会正常工作,但没有...

后来我发现如果我删除 DotNetSeleniumExtras.PageObjects nuget 包一切正常。这很好,但我需要这个包能够使用 PageFactory.InitElements() 进行页面对象初始化,并使用 FindsBy 属性绑定 UI 元素。我检查了 DotNetSeleniumExtras.PageObjects 包,它也使用 selenium 4.

你有什么办法解决这个问题吗?如果您需要查看源代码,请告诉我 (它相当广泛所以,我不想膨胀这个post)

所以这是我解决这个问题的方法:

  1. 我从代码中删除了 DotNetSeleniumExtras 包。
    在那之后,我终于能够从 浏览器,因为我摆脱了问题中显示的错误。
  2. 删除 DotNetSeleniumExtras 包后,我丢失了用于初始化页面对象的 PageFactory。
    我通过将所有 Web 元素(页面对象的属性)转换为计算属性来解决此问题:
public class PageObject
{
    private readonly IWebDriver driver;         

    public IWebElement PageLink => driver.FindElement(By.XPath(@"my custom XPath"));
    public IWebElement TitleMain => driver.FindElement(By.Id("some Id"));

    // etc

    public PageObject(IWebDriver webDriver)
    {
         driver = webDrvier;
    }
}

下面的代码显示了如何使用上面的 class 的示例:

var pageObj = new PageObject(driver);
Console.Writeline(pageObj.PageLink.Enabled);

PS:感谢RichEdwards给我提示如何解决这个问题

从 Selenium.WebDriver 4.0 开始,需要同时安装 Selenium.WebDriver 和 Selenium.Support nuget 包(相同版本)以避免此问题。

我在为我的 C# 项目测试将 Selenium WebDriver 3 升级到 WebDriver 4 时遇到了同样的问题。 只需从代码中删除 DotNetSeleniumExtras 包,问题就解决了。 然后安装 DotNetSeleniumExtras.core (4.1) 软件包