在其他示例之后,我以前是按照PageFactory.InitElements(driver, page)
的方法来初始化我的页面的,然后才调用该方法以在那些特定页面上查找元素。
但是,似乎PageFactory现在已被.netcore淘汰,如此处所述:https://github.com/SeleniumHQ/selenium/issues/4387
我遇到的问题是在没有PageFactory.Init的情况下初始化用于硒自动化框架的页面。我似乎无法通过以下示例代码的空引用异常。这是我现在设置的:
使用最新的.netcore,selenium.chrome.webdriver,selenium.webdriver,selenium支持和xunit
示例设置:
Test.cs
[Fact]
public void CanLogin()
{
Pages.Login.Login("username", "password");
Assert.True(true);
}
Pages.cs
///这是我想要初始化我的登录名并返回它但有困难的地方。这是完全假的...这就是我想要发生的地方
public LoginPage Login
{
return Init LoginPage here;
}
LoginPage.cs
private IWebElement userNameTextField;
private IWebElement passwordTextField;
public void Login(string userName, string password)
{
userNameTextField.SendKeys(userName);
passwordTextField.SendKeys(password);
}
一旦击中Pages.Login.Login()
,它就不会说System.NullReferenceException : Object reference not set to an instance of an object.
我已经尝试了很多方法,但是找不到能够遵循的正确模式以能够启动Pages.cs中的所有必需页面,例如:LoginPage
有什么想法吗?
答案 0 :(得分:0)
创建页面类的实例,并在测试中通过该实例。请参阅下面的解决方案
[TestClass]
public class UnitTest2
{
[TestMethod]
public void CanLogin()
{
Page LoginPage = PageInitialization.Login;
LoginPage.Login("username", "password");
}
public class PageInitialization
{
private Page loginPage;
public PageInitialization()
{
loginPage = new Page();
}
public static Page Login
{
get { return Instance.loginPage; }
}
private static PageInitialization Instance
{
get
{
return new PageInitialization();
}
}
}
public class Page
{
private IWebElement userNameTextField;
private IWebElement passwordTextField;
public void Login(string userName, string password)
{
userNameTextField.SendKeys(userName);
passwordTextField.SendKeys(password);
}
}
}
答案 1 :(得分:0)
这已由SeleniumExtras.PageObjects解决
然后,我就能按照上面原始发布中找到的模式进行操作:PageFactory.InitElements(驱动程序,页面)