为什么我无法在步骤定义之外创建我的类的对象
本文关键字:创建 我的 对象 定义 为什么 | 更新日期: 2023-09-27 18:36:06
我只是使用SpecFlow+Selenium+pageObject自动化网站。当我初始化 SignIn 类的对象时,我收到空指针异常。我尝试在 LoginTest Class(步骤定义文件)的构造函数中,但同样的错误,然后我移动到第一步定义,然后它正在工作。新问题是我不能在第二步定义中使用相同的对象,因为它是在本地初始化的。
我正在添加我的代码,请告诉我我在所有脚本中犯了什么错误。
namespace UnitTestProject5.Pages
{
public class SignIn
{
public IWebDriver driver;
[FindsBy(How = How.XPath, Using ("//nav[@role='navigation']/div[3]/div[1]/div/div/div/ul/li[5]/a"))]
public IWebElement Login { get; set; }
public IWebElement Username;
public IWebElement Password;
public IWebElement Signin;
public SignIn(IWebDriver driver)
{
this.driver = driver;
}
public void LoginToMyAccount(String username,String password)
{
Username.SendKeys(username);
Password.SendKeys(password);
Signin.Submit();
}
//...
}
}
和。。
namespace UnitTestProject5
{
[Binding]
public class LoginTest
{
IWebDriver driver = null;
// constants con = new constants();
[Given(@"Go to website")]
public void GivenGoToWebsite()
{
driver =new FirefoxDriver();
driver.Navigate().GoToUrl("https://xero.com");
SignIn sin = new SignIn(driver);
PageFactory.InitElements(driver, sin);
sin.Clicklogin();
}
[Given(@"Enter user name & password")]
public void GivenEnterUserNamePassword()
{
sin.
}
[When(@"I press submit")]
public void WhenIPressSubmit()
{
Console.WriteLine("hello");
}
[Then(@"i should be my landing page")]
public void ThenIShouldBeMyLandingPage()
{
Console.WriteLine("hello");
}
}
}
功能/场景:
Feature: Successful Login
Scenario: Successful Login
Given Go to website
And Enter user name & password
When I press submit
Then i should be my landing page
我相信
你正在失去每个给定的场景上下文之间的变量。每个方法"Given-When-Then"都是在静态上下文中执行的,您在类中定义的任何变量在调用它们之间都会丢失。解决此问题的正确方法是使用 ScenarioContext 和 FeatureContext 对象。下面的伪示例:
:
[Given("Something nice")]
public void WhenIStartSomething()
{
// Add an inspector to the current context
var currentPageInspector = ScenarioContext.Current.Set("PageInspector", new PageInspector());
// Construct other stuff
ScenarioContext.Current.Add("signInInstance", SignIn(...));
}
[When("I do something planned")]
public void WhenIDoSomethingPlanned()
{
var signIn = ScenarioContext.Current.Get<SignIn>();
// do the action with signIn
}
[Then("I should see the following result")]
public void ThenIShouldSeeTheFollowingResult()
{
var currentPageInspector = ScenarioContext.Current.Get<PageInspector>();
currentPageInspector.CurrentPage.Title.ShouldEqual("My Landing Page");
}
您基本上要做的是创建PageInspector和SignIn对象的静态实例,这些对象仅作为它们正在运行的场景的一部分存在。如果您有重复任何步骤的不同方案,则 ScenarioContext 将确保您对那里的对象具有不同的静态上下文。