Sam*_*J26 6 c# selenium selenium-chromedriver selenium-webdriver selenium4
我正在使用 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
Run Code Online (Sandbox Code Playgroud)
来自 selenium 的官方发行说明:
https://github.com/SeleniumHQ/selenium/blob/master/dotnet/CHANGELOG中的每个 v4.0.0a1 “已将 IWrapsDriver 和 IWrapsElement 从 OpenQA.Selenium.Internal 命名空间移动到 OpenQA.Selenium 命名空间。这应该是一个 no -op 对于绝大多数用户来说,只需要重新编译代码,因为这两个接口在基本命名空间中都具有返回类型,这意味着用户可能已经在其源代码中具有根命名空间的“using”语句。遇到这种情况,更改代码中的命名空间并重建应该可以解决该错误。”
我仔细检查了所有出现的 OpenQA.Selenium.Internal 命名空间,发现该命名空间甚至没有在我的代码中使用。所以我以为一切都会正常进行,但是没有......
后来我发现,如果删除 DotNetSeleniumExtras.PageObjects nuget 包,一切都会正常。这很好,但我需要这个包能够使用 PageFactory.InitElements() 进行页面对象初始化,并使用 FindsBy 属性来绑定 UI 元素。我检查了 DotNetSeleniumExtras.PageObjects 包,它也使用 selenium 4。
您对如何解决这个问题有什么想法吗?如果您需要查看源代码,请告诉我(源代码非常广泛,所以我不想让这篇文章变得臃肿)
所以这是我解决这个问题的方法:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
下面的代码显示了如何使用上面的类的示例:
var pageObj = new PageObject(driver);
Console.Writeline(pageObj.PageLink.Enabled);
Run Code Online (Sandbox Code Playgroud)
PS:感谢RichEdwards给我提示如何解决这个问题
| 归档时间: |
|
| 查看次数: |
9656 次 |
| 最近记录: |