Tessy
Tessy

Reputation: 71

Page Object Pattern with Selenium and Testng failure

I am having issue running the below Page Object Model with testng.

TestClass 1

package Proj;

public class signInPage {

    public static void main(String[] args)  {
         System.setProperty("webdriver.chrome.driver", "C:/chromedriver_win32/chromedriver.exe");
      ChromeDriver driver = new ChromeDriver(); 
      driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }
        public signInPage (WebDriver driver)
        {
            this.driver=driver;
        }

        WebDriver driver;
        public signInPage() 
        {
            driver.get("baseURL");

        }

        By Email_address = By.name("Username");
        By Password = By.id("Password");

        public WebElement Email_address () 
        {
        return driver.findElement(Email_address);
        }

        public WebElement Password ()
        {
            return driver.findElement(Password);
        }
       public WebElement button_id () 
    {
    return driver.findElement(button_id);
    }
}

TestClass 2

package Proj;

public class MyDetailsPage {

    public MyDetailsPage (WebDriver driver)
    {
        this.driver=driver;
    }
    WebDriver driver;

    By My_Details=By.xpath(".//*[@id='masterForm']/div[5]/div/div[3]/div[3]/a/span");
    By First_name = By.id("FirstName"); 
    By  Last_name= By.name("NameModel.LastName");
    By button_id= By.id("stage_one_button");

    public WebElement My_Details () 
    {
    return driver.findElement(My_Details);
    }

    public WebElement First_name () 
    {
    return driver.findElement(First_name);
    }

    public WebElement Last_name () 
    {
    return driver.findElement(Last_name);
    }
    }

TestData Page

 package Proj;



    public class testData  {

        public static void main (String[] args) throws InterruptedException {
            System.setProperty("webdriver.chrome.driver", "C:/chromedriver_win32/chromedriver.exe");
              ChromeDriver driver = new ChromeDriver(); 
    }

        public void testDetails (WebDriver driver)
        {
            this.driver=driver;
        }
            static WebDriver driver;


               protected static String baseUrl;
               protected static String Email_address;
               protected static String Password;
               protected String First_name;
               protected String Last_name;

        public void Data () {
                 baseUrl = "https://login.yahoo.com/";
                 driver = new ChromeDriver();
                 Email_address = "[email protected]";
                 Password = "myname";
                 First_name = "Testing";
                 Last_name = "Account";

        }
         }

TestCases

package Proj;

import org.testng.annotations.Test;
import org.openqa.selenium.SearchContext;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeSuite;


public class TestCases extends testData {

    private static SearchContext WebElement;

    @BeforeSuite
    public void BeforeSuite () {
        System.setProperty("webdriver.chrome.driver", "C:/chromedriver_win32/chromedriver.exe");
         WebDriver driver = new ChromeDriver ();    

    }

     @BeforeClass 
    public void driver(WebDriver driver)  throws InterruptedException

            {
               this.driver = driver;
                driver.get(baseUrl);    
            }

      @Test
     public void AllTest () throws InterruptedException {
        signInPage a = new signInPage (driver);
        a.Email_address().sendKeys(Email_address);
        a.Password().sendKeys(Password);
        a.SIGN_IN().click();

        MyDetailsPage e = new MyDetailsPage (driver);       
        e.My_Details ().click();
        e.First_name ().sendKeys("Testing");
        e.Last_name (). sendKeys ("Account");
        e.button_id ().click();     

        }
        } 

It opens up Browser but fail to enter baseUrl and could not perform the Test. It is failing from the TestCases class. No matter how i have tried to reconfigure this with no luck. I appreciate your prompt assistance. Thank you

FAILED CONFIGURATION: @BeforeClass driver
org.testng.TestNGException: 
Can inject only one of <ITestContext, XmlTest> into a BeforeClass annotated driver.
For more information on native dependency injection please refer to http://testng.org/doc/documentation-main.html#native-dependency-injection
    at org.testng.internal.Parameters.checkParameterTypes(Parameters.java:244)
    at org.testng.internal.Parameters.createParameters(Parameters.java:172)
    at org.testng.internal.Parameters.createParameters(Parameters.java:458)
    at org.testng.internal.Parameters.createConfigurationParameters(Parameters.java:118)
    at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:206)
    at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:146)
    at org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:166)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:105)
    at org.testng.TestRunner.privateRun(TestRunner.java:744)
    at org.testng.TestRunner.run(TestRunner.java:602)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:380)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:375)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
    at org.testng.SuiteRunner.run(SuiteRunner.java:289)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1301)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1226)
    at org.testng.TestNG.runSuites(TestNG.java:1144)
    at org.testng.TestNG.run(TestNG.java:1115)
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:230)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:76)

SKIPPED: AllTest
org.testng.TestNGException: 
Can inject only one of <ITestContext, XmlTest> into a BeforeClass annotated driver.
For more information on native dependency injection please refer to http://testng.org/doc/documentation-main.html#native-dependency-injection
    at org.testng.internal.Parameters.checkParameterTypes(Parameters.java:244)
    at org.testng.internal.Parameters.createParameters(Parameters.java:172)
    at org.testng.internal.Parameters.createParameters(Parameters.java:458)
    at org.testng.internal.Parameters.createConfigurationParameters(Parameters.java:118)
    at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:206)
    at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:146)
    at org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:166)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:105)
    at org.testng.TestRunner.privateRun(TestRunner.java:744)
    at org.testng.TestRunner.run(TestRunner.java:602)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:380)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:375)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
    at org.testng.SuiteRunner.run(SuiteRunner.java:289)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1301)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1226)
    at org.testng.TestNG.runSuites(TestNG.java:1144)
    at org.testng.TestNG.run(TestNG.java:1115)
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:230)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:76)


===============================================
    Default test
    Tests run: 1, Failures: 0, Skips: 1
    Configuration Failures: 1, Skips: 0
===============================================


    ===============================================
    Default suite
    Total tests run: 1, Failures: 0, Skips: 1
    Configuration Failures: 1, Skips: 0
    ===============================================

Upvotes: 1

Views: 332

Answers (2)

Kushal Bhalaik
Kushal Bhalaik

Reputation: 3384

As juherr pointed out that you can not parameterize the @BeforeClass in this manner by passing webdriver instead you can follow following approach to do so:

public class TestCases extends testData {

private static SearchContext WebElement;
WebDriver driver;


@BeforeSuite
public void BeforeSuite () throws InterruptedException {
    System.setProperty("webdriver.chrome.driver", "C:\\Eclipse\\Selenium\\chromedriver.exe");

}

@BeforeClass 
public void driver()  throws InterruptedException
{
    driver = new ChromeDriver ();    

    testData td = new testData ();

    driver.get(td.baseUrl);    
}
/
/
/
/

Upvotes: 1

juherr
juherr

Reputation: 5740

public void driver(WebDriver driver) is not allowed on a @BeforeClass method. You have to remove the parameter and find another way to set the driver.

Upvotes: 1

Related Questions