【问题标题】:Could not load type 'OpenQA.Selenium.Internal.IWrapsElement' from assembly 'WebDriver, Version=4.0.0.0, Culture=neutral, PublicKeyToken=null'无法从程序集“WebDriver,版本=4.0.0.0,文化=中性,PublicKeyToken=null”加载类型“OpenQA.Selenium.Internal.IWrapsElement”
【发布时间】:2021-10-13 22:32:41
【问题描述】:

我正在使用 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 "已将 IWrapsDriver 和 IWrapsElement 从 OpenQA.Selenium.Internal 命名空间移至 OpenQA.Selenium 命名空间。这对绝大多数用户来说应该是无操作的,只需要重新编译代码,鉴于这两个接口都在基本命名空间中具有返回类型,这意味着用户可能已经在其源代码中具有根命名空间的“使用”语句。如果遇到错误,更改代码中的命名空间并重建应该可以解决错误。”

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

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

您对如何解决这个问题有任何想法吗?如果您需要查看源代码,请告诉我 (内容相当广泛,我不想让这篇文章变得臃肿)

【问题讨论】:

  • dotnetextras github.com/DotNetSeleniumTools/DotNetSeleniumExtras 已经有 4 年没有更新了 - 自述文件说没有所有者,所以它看起来不太可能适用于 selenium 4。在 c# 中你不需要完全使用页面工厂 - 当他们删除它时,他们说这是因为它是在.net中工作的错误方法。您只需使用 lambda 运算符在 pom 中指定您的对象:private By yourByIdendifier => By.XPath("//button[text()='Hello World']");

标签: c# selenium selenium-webdriver selenium-chromedriver selenium4


【解决方案1】:

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

  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;
    }
}

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-07
      • 1970-01-01
      • 1970-01-01
      • 2018-02-05
      • 2016-11-19
      • 1970-01-01
      • 2020-03-08
      • 2014-12-19
      相关资源
      最近更新 更多