规范 - 功能之间共享步骤问题

时间:2014-09-15 20:58:43

标签: c# selenium specflow

我打破了对此的测试,以便我有Login,ResetPassword,ForgotPassword等区域的功能文件。让我们说我有下面的例子。我有一个自动化步骤,在CreateAccount.feature中创建一个全新的用户。该步骤在该功能/步骤类中多次使用而没有问题。但现在我希望用户更改密码,以便我创建一个新的功能文件MyAccount.feature。当我复制给定声明时,会立即找到它。然后我添加代码以单击重置密码并继续执行其余步骤。

当我运行ResetPassword测试时,自动化会创建新用户,但是当它进入第2步时,"当我单击重置密码"它失败了,因为它无法找到元素。由于绑定是全局的,这让我很奇怪。所以我所做的就是采取步骤"鉴于我创建了我的帐户"并重命名它并添加到其他功能文件/步骤类并再次运行它。它工作正常。

我不确定为什么我不能在步骤之间分享。有什么想法吗?

一些更新显示更多代码...

 CreateAccount.feature
 scenario: Feature Create Account
 Given I have created my account 
 -----------

CreateAccountsteps.cs
namespace Project
{
[Binding]
public class CreateAccount:  BaseTestObject
{

[Given]
public void Given_I_have_created_my_account()
{
        ConfigProperties.Environment = "Test";
        TestDriver.goToUrl(ConfigProperties.StartUrl);
        TestDriver.goToUrl(ConfigProperties.StartUrl + "Create/Account");
        [followed by input for creating a user acct]

-------------------------------------------------


 MyAccount.feature
 scenario: Feature Change Password
 Given I have created my account 
 When I Click Reset Password
 ...........

 MyAccountSteps.cs

 namespace Project
 {
 [Binding]
 public class MyAccountSteps: BaseTestObject
 {

 [When]
 public void When_I_click_Reset_Password()
 {
 On.MyHeaderPage.BtnResetPassword.Click();
 }
 [followed by rest of steps to change password]

BaseTestObject.cs

    namespace Project
  {

 public class BaseTestObject
  {
     private IWebDriver seleniumDriver;
    private IDriver testDriver;

    [TestInitialize]
    public virtual void Setup()
    {
        TestDriver.goToUrl(ConfigProperties.StartUrl);
    }


    [AfterScenario]
    public void CleanUp()
    {
        if (seleniumDriver != null)
        {
            SeleniumDriver.Dispose();
            seleniumDriver = null;
        }
    }



    public IWebDriver SeleniumDriver
    {
        get
        {
            if (seleniumDriver == null)
            {
                seleniumDriver = GetDriver();
            }
            return seleniumDriver;
        }
    }

    public IDriver TestDriver
    {
        get
        {
            if (testDriver == null)
            {
                testDriver = new UiDriver(SeleniumDriver);
            }
            return testDriver;
        }
    }


    public CurrentPageObjectScope On
    {
        get
        {
            return new CurrentPageObjectScope(TestDriver);
        }
    }

    public static String GetTimestamp()
    {
        return DateTime.Now.ToString("yyyyMMddhhmmssfff");
    }

    public static String GetTimestamp2()
    {
        return DateTime.Now.ToString("M/d/yyyy");
    }

    private IWebDriver GetDriver()
    {
        switch (ConfigProperties.Browser.ToLower())
        {
            case "firefox":
                return new FirefoxDriver();
            case "chrome":



                ChromeOptions options = new ChromeOptions();
                ChromeDriverService service =               ChromeDriverService.CreateDefaultService(@"../Chrome/");
                service.SuppressInitialDiagnosticInformation = true;
                service.HideCommandPromptWindow = true;
                options.AddArguments("test-type");
                options.AddArgument("--start-maximized");
                return new ChromeDriver(service, options);

            case "ie":
            case "internetexplorer":

                return new InternetExplorerDriver(@"../IE/");


            default:
                throw new NotImplementedException("Unknown browser string in Config properties " + ConfigProperties.Browser);
        }


    }

2 个答案:

答案 0 :(得分:0)

根据您的更新,您似乎错误地命名了您的步骤。您的功能说:

scenario: Feature Change Password
Given I have created my account 
When I Click Reset Password

但您的步骤名称为When_I_click_My_Account

这对我来说似乎不对。

实际上我们需要更多详细信息(比如实际的异常消息),也许还需要BaseTestObject看起来像什么。

答案 1 :(得分:0)

已解决 - 在BaseTestObject中,我将方法更改为静态。