简体   繁体   中英

Running java selenium webdriver tests across many classes in one browser using testng

Current set up, I currently have my tests set up that each class instantiates its own browser. Each class is based on a page I want to test. I now want my tests to all to run in the one browser. Mu code has the current set up. I have a base page where common methods are inherited, I then have a java.class for the methods of a specific page followed by a test.class to run my tests from.

public class BasePage {

@FindBy(id = "j_username") WebElement field_Username;
@FindBy(id = "j_password") WebElement field_Password;
@FindBy(name = "login") WebElement button_Login;

public WebDriver driver;
public WebDriverWait wait;

protected JavascriptExecutor jsExecutor;

public String PAGE_URL;
public String PAGE_TITLE;

public BasePage(WebDriver driver){
    this.driver = driver;
    jsExecutor = ((JavascriptExecutor) driver);
    wait = new WebDriverWait(driver, 200);
}

public void loadPage(){

    driver.get(getPageUrl());
    driver.manage().window().maximize();
    for(int i=0; i<2; i++){ 
        driver.findElement(By.tagName("html")).sendKeys(Keys.chord(Keys.CONTROL, Keys.SUBTRACT));
        } 
}

protected void login(String username, String password){
    findDynamicElement(By.id("j_username") , 7);
    setText_Login(username);
    setText_PasswordLogin(password);
    clickLoginMain();
}

public class CreateBillingRange  extends BasePage {

    @FindBy(id = "j_username") WebElement field_Username;
    @FindBy(id = "j_password") WebElement field_Password;
    @FindBy(name = "login") WebElement button_Login;
    @FindBy(id = "add_label") WebElement button_AddLabel;
    @FindBy(linkText = "Policy") WebElement field_Policy;
    @FindBy(linkText = "SPCM") WebElement field_SPCM;
    @FindBy(linkText = "Billing Range") WebElement field_BR;
    @FindBy(id = "addChargingProfile_label") WebElement button_addChargingProfile;
    @FindBy(name = "addBillingNumberRange") WebElement button_addBillingNumberRange;
    @FindBy(id = "startRange") WebElement field_StartRange; 
    @FindBy(id = "endRange") WebElement field_EndRange; 
    @FindBy(id = "name") WebElement field_Name;
    @FindBy(name = "saveBillingNumberRange") WebElement button_SaveBillingNumberRange;

    @FindBy(id = "number") WebElement field_NumberSearch;
    @FindBy(name = "search") WebElement field_Submit;
    @FindBy(name = "ids") WebElement checkbox_Number;
    @FindBy(name = "deleteBillingNumberRange") WebElement button_Delete;
    @FindBy(id = "okDialogButton_label") WebElement okDialogButton_label;



    public CreateBillingRange(WebDriver driver) {
        super(driver);
        this.PAGE_URL = "http://xxxxx:xxx/page";
    }

    public void login(String username, String password){
        findDynamicElement(By.id("j_username") , 7);
        setText_Login(username);
        setText_PasswordLogin(password);
        clickLoginMain();
    }

    public void setText_Login(String text){
        setElementText(field_Username, text);
    }


    public void setText_PasswordLogin(String text){
        setElementText(field_Password, text);
    }

    public void clickLoginMain(){
        clickElement(button_Login);
    }

    public void click_SignUpButton(){
        clickElement(button_Login);
    }

    public void openCharging() {

        findDynamicElement(By.linkText("Policy") , 19);
        clickElement(field_Policy);
        clickElement(field_SPCM);
        clickElement(field_BR);

    }   

    public void addBillingRange(String start, String end){
        findDynamicElement(By.name("addBillingNumberRange"), 10);
        clickElement(button_addBillingNumberRange);
        findDynamicElement(By.id("startRange"), 3);
        setElementText(field_StartRange, start);
        setElementText(field_EndRange, end);
        clickElement(button_SaveBillingNumberRange);
        findDynamicElement(By.id("successMessages") , 5);
    }

    public void deleteBillingRange(String BillingRange){
        findDynamicElement(By.name("search"),20);
        field_NumberSearch.click();
        field_NumberSearch.sendKeys(BillingRange);
        field_Submit.click();
        findDynamicElement(By.name("ids"),20);
        checkbox_Number.click();
        button_Delete.click();
        accpetConfirmSuccess();

    }




public class CreateBundle  extends BasePage{

    @FindBy(id = "j_username") WebElement field_Username;
    @FindBy(id = "j_password") WebElement field_Password;
    @FindBy(name = "login") WebElement button_Login;
    @FindBy(id = "add_label") WebElement button_AddLabel;
    @FindBy(linkText = "Policy") WebElement field_Policy;
    @FindBy(linkText = "SPCM") WebElement field_SPCM;
    @FindBy(linkText = "Plan Mgmt") WebElement field_PlanMgmt;
    @FindBy(linkText = "Bundles") WebElement field_Bundles;
    @FindBy(id = "addOcsButton_label") WebElement button_addOCS;
    @FindBy(id = "alias") WebElement field_alias;
    @FindBy(id = "value") WebElement field_value;
    @FindBy(id = "submitActionButton_label") WebElement button_OCSsave; 
    @FindBy(id = "add") WebElement button_addLabel;
    @FindBy(id = "dataPlanName") WebElement field_DataPlan;
    @FindBy(id = "addComboPackServiceButton_label") WebElement button_addComboService;
    @FindBy(id = "amount") WebElement field_amount;
    @FindBy(id = "ocsAccountReference") WebElement field_OCSAccount;
    @FindBy(id = "days") WebElement field_Days;
    @FindBy(id = "submitActionButton_label") WebElement button_SubmitAction;
    @FindBy(id = "save_label") WebElement button_BundleSave;

    @FindBy(id = "dataPlanName") WebElement field_OCSSearch;
    @FindBy(id = "search_label") WebElement field_OCSSubmit;
    @FindBy(name = "ids") WebElement checkbox_OCS;
    @FindBy(id = "delete_label") WebElement button_DeleteOCS;
    @FindBy(xpath = "/html/body/div/div[2]/div[1]/form/fieldset[3]/div[2]/table/tbody/tr[4]/td[1]/input") WebElement field_OCSDelete;
    @FindBy(id = "deleteOcsRef_label") WebElement button_deleteOCS;


    public CreateBundle(WebDriver driver) {
        super(driver);
        this.PAGE_URL = "http://xxxxx.xxx.x/page";
    }


    public void openBundle() {

        findDynamicElement(By.linkText("Policy") , 19);
        clickElement(field_Policy);
        clickElement(field_SPCM);
        clickElement(field_PlanMgmt);
        clickElement(field_Bundles);

    }   

This will run my tests in separate browsers

public class BillingRange_Test {


    public WebDriver driver;
    public WebDriverWait wait;
    CreateBillingRange CreateBillingRange;


    @BeforeClass(alwaysRun = true)
    public void setup() throws MalformedURLException{
        DesiredCapabilities capabilities = DesiredCapabilities.firefox();
        capabilities.setBrowserName("firefox");
        this.driver = new RemoteWebDriver(new URL("http://192.168.1.237:5556/wd/hub"), capabilities);
        wait = new WebDriverWait(driver, 10);
        CreateBillingRange = PageFactory.initElements(driver, CreateBillingRange.class );
    }

    @AfterClass(alwaysRun = true)
    public void teardown(){
        this.driver.quit();
    }


    @BeforeTest
    public void testSignUpMainPage(){
        CreateBillingRange.loadPage();
        CreateBillingRange.login("super","5tg7uj6yh");

    }

    @Test(priority=1,retryAnalyzer=Retry.class)
    public void addBillingRange(){
        CreateBillingRange.openCharging();
        CreateBillingRange.addBillingRange("8800088","1111111111");

    }






public class Bundle_Test {


    public WebDriver driver;
    public WebDriverWait wait;
    CreateBundle CreateBundle;


    @BeforeClass(alwaysRun = true)
    public void setup() throws MalformedURLException{
        DesiredCapabilities capabilities = DesiredCapabilities.firefox();
        capabilities.setBrowserName("firefox");
        this.driver = new RemoteWebDriver(new URL("http://192.168.1.237:5556/wd/hub"), capabilities);
        wait = new WebDriverWait(driver, 10);
        CreateBundle = PageFactory.initElements(driver, CreateBundle.class );
    }

    @AfterClass(alwaysRun = true)
    public void teardown(){
        this.driver.quit();
    }


    @Test(priority=1)
    public void testSignUpMainPage(){
        CreateBundle.loadPage();
        CreateBundle.login("super","5tg7uj6yh");

    }

    @Test
    public void addBundle(){
        CreateBundle.openBundle();
        CreateBundle.createBundles("Test", "1","AFL","1");

    }

This will run my tests in the one browser

    public WebDriver driver;
    public WebDriverWait wait;
    protected String baseUrl;
    protected String nodeURL;
    CreateBillingRange CreateBillingRange;
    CreateBundle CreateBundle;


    @BeforeClass(alwaysRun = true)
    public void setup() throws MalformedURLException{
        DesiredCapabilities capabilities = DesiredCapabilities.firefox();
        capabilities.setBrowserName("firefox");
        this.driver = new RemoteWebDriver(new URL("http://192.168.1.236:5555/wd/hub"), capabilities);
        wait = new WebDriverWait(driver, 10);
        CreateBillingRange = PageFactory.initElements(driver,CreateBillingRange.class );
        CreateBundle = PageFactory.initElements(driver, CreateBundle.class );
    }




    //@AfterClass(alwaysRun = true)
    public void teardown(){
        this.driver.quit();
    }


    @Test(priority=20)
    public void testSignUpMainPage(){
        CreateBillingRange.loadPage();
        CreateBillingRange.login("super","5tg7uj6yh");
        System.out.println("Yes");

    }

    @Test(priority=21)
    public void addOCSAccount(){
        CreateBundle.openBundle();
        CreateBundle.createOSCAccount("Name Selenium WebDriver", "2");

    }

}

This will run my test in one browser. However it is not practical to have all by objects in the one test class. What I wish to do is run my first test class and instantiate the broswer then using TestNG call each test class and run my tests in the one browser. However doing this will only run my tests in the first class which contains the @BeforeClass when these tests are ran and the next test class is called I get a null pointer error . Can anyone help me run my tests in the one browser across all my test classes.

It looks like you are initiating the driver in BeforeClass of each test and closing after. To work only in one browser and to quit after all or total suite is executed, just create one class and initiate driver in BeforeSuite. extend this to all you test classes. for example

 public class config{

 static WebDriver driver;

 @BeforeSuite
 public void setup(){

driver=new FirefoxDriver(); //here use your setup

}

@AfterSuite
public void tearDown(){
driver.quit();
}

}

Extends this class to all you test class. in your test classes dont use that setup in beforeclass again and dont use closing the browser afterclass

  public class NewTest1 extends config{

   @Test
    public void test1() {
    driver.get("http://www.google.com");
   }
  }

Thank You, Murali

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