【问题标题】:Error CS7036 There is no argument given that corresponds to the required formal parameter 'driver' of 'SpecflowBaseTest.SpecflowBaseTest(IWebDriver)'错误 CS7036 没有给出与“SpecflowBaseTest.SpecflowBaseTest(IWebDriver)”所需的形式参数“驱动程序”相对应的参数
【发布时间】:2019-10-22 18:09:08
【问题描述】:

我正在创建一个新框架,因为 PageFactory 已被弃用。我收到了错误

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

我的框架的完整代码 sn-p 如下。我正在尝试依赖注入,因为 PageFactory 已被弃用,不再使用。

我不确定如何解决此错误。一些帮助表示赞赏。谢谢

基类

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();
    }
}
}

登录页面类

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; }

}
}

步骤文件

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.
    }
}
}

【问题讨论】:

    标签: c# selenium selenium-webdriver specflow


    【解决方案1】:

    你真的应该在这里做三件事。

    1. 从 SpecflowBaseTest 中移除 LoginPage 属性
    2. 从 LoginSteps 调用基类构造函数
    3. LoginPage 属性和初始化代码移动到LoginSteps:
    [Binding]
    public class LoginSteps : SpecflowBaseTest
    {
        private LoginPage LoginPage { get; }
    
        public LoginSteps(IWebDriver driver) : base(driver)
        {
            LoginPage = new LoginPage(driver);
        }
    }
    

    【讨论】:

      【解决方案2】:

      在你的LoginSteps 课堂上,你写过:

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

      构造函数没有使用单个参数调用基类 (SpecflowBaseTest) 构造函数,并且基类也没有默认构造函数。因此出现此错误。

      为了解决这个问题,您需要使用base 关键字在LoginSteps 构造函数中调用基类构造函数。像这样的:

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

      您需要在基类中创建一个默认构造函数。像这样的:

      public SpecflowBaseTest()
      {
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-18
        • 1970-01-01
        • 2017-07-18
        • 2019-06-30
        • 1970-01-01
        • 2016-05-13
        相关资源
        最近更新 更多