简体   繁体   中英

Call Methods from two classes in Selenium C#

This is probably a stupid question but I haven't found an answer that leads me to a solution yet

Say I have a testmethod to verify the functionality of a login portal. It's in TestClassA. I want to run that method in TestClassB's TestInitialize method so I can reliably have selenium start on a blank slate for testing features past that login portal.

Here's the test code in question

using Login_Elements;
using Dashboard;

namespace Test_Dashboard_Elements
{
[TestClass]
public class DashboardTests
{
    IWebDriver _driver;
    DashboardElements dash;

    [TestInitialize]
    public void Test_Setup()
    {
        dash = new DashboardElements(_driver);
        LoginPage login = new LoginPage(_driver);
        _driver = new FirefoxDriver();
        _driver.Navigate().GoToUrl("exampleurl/login");
        login.Login();
    }
}

Which calls an instance of DashboardElements and passes the selenium webdriver, then calls an instance of LoginPage and passes the selenium webdriver (which I assume is the issue), and calls the login method from LoginPage

    IWebDriver _driver;

    //Username field
    [FindsBy(How = How.Id, Using = "username")]
    private IWebElement userName;

    //Password field
    [FindsBy(How = How.Id, Using = "password")]
    private IWebElement password;

    //Submit Button
    [FindsBy(How = How.ClassName, Using = "btn")]
    private  IWebElement submit_button;

    //Constructor
    public LoginPage(IWebDriver driver)
    {
        this._driver = driver;
        PageFactory.InitElements(driver, this);
    }

    //Sends passed string to username field
    public void sendUserName(string strUsername)
    {
        userName.SendKeys(strUsername);
    }

    //Sends passed string to password field
    public void sendPassword(string strPassword)
    {
        password.SendKeys(strPassword);
    }

    //Clicks submit button
    public void submit()
    {
        submit_button.Click();
    }

    public void Login()
    {
        sendUserName("username");
        sendPassword("password!");
        submit();
    }

This returns

>Message: Initialization method Test_Dashboard_Elements.DashboardTests.Test_Setup threw exception.  System.ArgumentNullException: System.ArgumentNullException: searchContext may not be null Parameter name: searchContext

I feel like this has to do with passing _driver twice but I'm not sure how else to do it

Stack trace:

>Test Name: Test_Link_Reports
Test FullName:  Test_Dashboard_Elements.DashboardTests.Test_Link_Reports
Test Source:    c:\Users\%USER%\Documents\Visual Studio 2013\Projects\%PATH TO DIR%\Page Tests\Dashboard Tests.cs : line 29
Test Outcome:   Failed
Test Duration:  0:00:06.0255821

Result Message:

>Initialization method Test_Dashboard_Elements.DashboardTests.Test_Setup threw exception. System.ArgumentNullException: System.ArgumentNullException: searchContext may not be null
Parameter name: searchContext.
Result StackTrace:  
at OpenQA.Selenium.Support.PageObjects.DefaultElementLocatorFactory.LocateElement(ISearchContext searchContext, IEnumerable`1 bys)
   at OpenQA.Selenium.Support.PageObjects.WebElementProxy.get_WrappedElement()
   at OpenQA.Selenium.Support.PageObjects.WebElementProxy.SendKeys(String text)
   at Login_Elements.LoginPage.sendUserName(String strUsername) in c:\Users\%USER%\Documents\Visual Studio 2013\Projects\%PATH TO DIR%\Page Elements\Login Elements.cs:line 39
   at Login_Elements.LoginPage.Login() in c:\Users\%USER%\Documents\Visual Studio 2013\Projects\%PATH TO DIR%\Page Elements\Login Elements.cs:line 56
   at Test_Dashboard_Elements.DashboardTests.Test_Setup() in c:\Users\%USER%\Documents\Visual Studio 2013\Projects\%PATH TO DIR%\Page Tests\Dashboard Tests.cs:line 24
DefaultElementLocatorFactory.LocateElement(ISearchContext searchContext, IEnumerable 1 bys)
WebElementProxy.get_WrappedElement()
WebElementProxy.SendKeys(String text)
LoginPage.sendUserName(String strUsername)
LoginPage.Login()
DashboardTests.Test_Setup()

Seems like the issue is with he driver instantiation. You are not passing the instantiated driver to DashboardElements() . To fix this:

  • First Instantiate the driver .
  • Pass the instantiated driver to the PageObject .

      using Login_Elements; using Dashboard; namespace Test_Dashboard_Elements { [TestClass] public class DashboardTests { IWebDriver _driver; DashboardElements dash; [TestInitialize] public void Test_Setup() { _driver = new FirefoxDriver(); dash = new DashboardElements(_driver); LoginPage login = new LoginPage(_driver); _driver.Navigate().GoToUrl("exampleurl/login"); login.Login(); } } 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM