Error CS7036 There is no argument given that corresponds to the required formal parameter 'driver' of 'SpecflowBaseTest.SpecflowBaseTest(IWebDriver)'

社会主义新天地 提交于 2020-01-24 19:46:09

问题


I am creating a new framework as PageFactory has been deprecated. I am getting the error

Error CS7036 There is no argument given that corresponds to the required 
formal parameter 'driver' of 
'SpecflowBaseTest.SpecflowBaseTest(IWebDriver)' UnitTestProject1 
D:\Selenium 
Projects\Olympus\UnitTestProject1\UnitTestProject1\Steps\LoginSteps.cs 14 
Active

My full code snippet of my framework is below. I am trying the dependency injection because PageFactory is deprecated, not used anymore.

I am not sure how to resolve this error. Some help appreciated. Thanks

BaseClass

using System;
using System.Collections.Generic;
using System.Linq;    
using TechTalk.SpecFlow;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using UnitTestProject1.Page;
using OpenQA.Selenium.Remote;
using BoDi;

namespace UnitTestProject1
{
[Binding]    
public class SpecflowBaseTest : TechTalk.SpecFlow.Steps
{
    protected IWebDriver Driver { get; }
    protected LoginPage LoginPage { get; }

    public SpecflowBaseTest(IWebDriver driver)
    {
        Driver = driver;
        LoginPage = new LoginPage(driver);
    }

    public void NavigateToURL(string URL)
    {
        Driver.Navigate().GoToUrl(URL);
    }
}
} 

SpecflowHooksClass

using System.Text;
using TechTalk.SpecFlow;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using UnitTestProject1.Page;
using OpenQA.Selenium.Remote;
using BoDi;

namespace UnitTestProject1
{
public class SpecFlowHooks
{
    private readonly IObjectContainer container;

    public SpecFlowHooks(IObjectContainer container)
    {
        this.container = container;
    }

    [BeforeStep]
    public void CreateWebDriver()
    {
        // Create and configure a concrete instance of IWebDriver
        IWebDriver driver = new ChromeDriver();
        {

        };

        // Make this instance available to all other step definitions
        container.RegisterInstanceAs(driver);
    }

    [AfterStep]
    public void DestroyWebDriver()
    {
        IWebDriver driver = container.Resolve<IWebDriver>();

        driver.Close();
        driver.Dispose();
    }
}
}

LoginPage Class

using System;
using System.Collections.Generic;
using System.Text;
using OpenQA.Selenium;
using SeleniumExtras.PageObjects;
using NUnit.Compatibility;
using Shouldly;
using OpenQA.Selenium.Remote;

namespace UnitTestProject1.Page
{
public class LoginPage : SpecflowBaseTest
{
    public LoginPage(IWebDriver browser) : base(browser)

    {
        //Driver = browser;
    }

    public void Login(string Username, string Password)
    {
        UsernameField.SendKeys(Username);
        PasswordField.SendKeys(Password);
        LoginButton.Click();
    }

    public void CheckUserIsLoggedIn(string Username)
    {
        AccountUsername.Displayed.ShouldBe(true, Username);
    }

    [FindsBy(How = How.CssSelector, Using = "#LoginUsername")]
    private IWebElement UsernameField { get; set; }

    [FindsBy(How = How.CssSelector, Using = "#LoginPassword")]
    private IWebElement PasswordField { get; set; }

    [FindsBy(How = How.CssSelector, Using = "#login-submit-button")]
    private IWebElement LoginButton { get; set; }

    [FindsBy(How = How.CssSelector, Using = "#div.accountUsrename")]
    private IWebElement AccountUsername { get; set; }

}
}

Steps file

using NUnit.Framework;
using System;
using TechTalk.SpecFlow;
using UnitTestProject1.Page;
using OpenQA.Selenium;

namespace UnitTestProject1.Steps
{
[Binding, Parallelizable]
public class LoginSteps : SpecflowBaseTest
{
    protected LoginPage LoginPage;

    public LoginSteps(LoginPage loginpage, IWebDriver driver)
    {
        //Driver = driver;
        this.LoginPage = loginpage;
    }

    [Given(@"I navigate to (.*)")]
    public void GivenINavigateToHttpsCompany_Com(string URL)
    {
        NavigateToURL(URL);
    }

    [Given(@"I enter bw_(.*) and (.*)")]
    public void GivenIEnterBw_Valid_UserAnd(string Username, string 
Password)
    {            
        LoginPage.Login(Username, Password);
    }

    [Then(@"I am logged in as bw_valid_user")]
    public void ThenIAmLoggedInAsBw_Valid_User()
    {
        //LoginPage.
    }
}
}

回答1:


There are three things you really should do here.

  1. Remove LoginPage property from SpecflowBaseTest
  2. Call the base class constructor from LoginSteps
  3. Move the LoginPage property and initialization code into LoginSteps:
[Binding]
public class LoginSteps : SpecflowBaseTest
{
    private LoginPage LoginPage { get; }

    public LoginSteps(IWebDriver driver) : base(driver)
    {
        LoginPage = new LoginPage(driver);
    }
}



回答2:


In your LoginSteps class, you have written:

public LoginSteps(LoginPage loginpage, IWebDriver driver)
{
    //Driver = driver;
    this.LoginPage = loginpage;
}

the constructor is not calling the base class (SpecflowBaseTest) constructor with single parameter and the base class does not have a default constructor either. Hence this error.

In order to resolve this, either you need to invoke the base class constructor in the LoginSteps constructor using base keyword. Something like this:

public LoginSteps(LoginPage loginpage, IWebDriver driver) : base(driver)
{
   //Driver = driver;
   this.LoginPage = loginpage;
}

OR

you need to create a default constructor in your base class. Something like this:

public SpecflowBaseTest()
{
}


来源:https://stackoverflow.com/questions/56490851/error-cs7036-there-is-no-argument-given-that-corresponds-to-the-required-formal

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!