I am using POM by selenium java. While trying to run two classes parallelly with TestNG xml I am facing this issue that the second class is not running properly. But when I use @BeforeClass annotation, then with two different windows, the second class runs perfectly.
My whole Page Object Model page classes and test classes are given below
Base Page:
package pages;import org.openqa.selenium.WebDriver;import org.openqa.selenium.support.PageFactory;import org.openqa.selenium.support.ui.WebDriverWait;import java.time.Duration;public class BasePage { WebDriver driver; WebDriverWait wait; public BasePage(WebDriver driver) { this.driver = driver; this.wait = new WebDriverWait(driver, Duration.ofSeconds(10)); PageFactory.initElements(driver, this); }}
Login page:
package pages;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.support.FindBy;import org.openqa.selenium.support.ui.ExpectedConditions;public class LoginPage extends BasePage{ public LoginPage(WebDriver driver) { super(driver); } // sign in button locator @FindBy(css = ".login-btn") WebElement SetSignInBtn; // email locator @FindBy(xpath = "//div[@class='form-group label-up']//input[@type='text']") WebElement SetEmailField; // proceed btn locator @FindBy(css = ".form-group.text-center") WebElement SetProceedBtn; // password locator @FindBy(css = "input[type='password']") WebElement SetPass; // sign in button locator @FindBy(id = "sign_in_button") WebElement SignBtn; public void Login(String mail, String passWord){ // sign in button click SetSignInBtn.click(); // email field input wait.until(ExpectedConditions.visibilityOf(SetEmailField)); SetEmailField.sendKeys(mail); // proceed button click SetProceedBtn.click(); // pass field input wait.until(ExpectedConditions.visibilityOf(SetPass)); SetPass.sendKeys(passWord); SignBtn.click(); }}
Recharge Page:
package pages;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.support.FindBy;import org.openqa.selenium.support.ui.ExpectedConditions;import org.openqa.selenium.support.ui.Select;import java.beans.Visibility;public class RechargePage extends BasePage{ public RechargePage(WebDriver driver) { super(driver); } @FindBy(id = "typeahead-basic") WebElement mobileNumberField; @FindBy(id = "telecom-operator") WebElement selectOperator; @FindBy(id = "connection-type") WebElement connectionType; @FindBy(xpath = "//input[@formcontrolname='amount']") WebElement amount; @FindBy(css = "button[type='submit']") WebElement proceedBtn; public void recharge(String mobileNumber, String rechargeAmount){ mobileNumberField.sendKeys(mobileNumber); wait.until(ExpectedConditions.visibilityOf(selectOperator)); selectOperator.click(); WebElement operatorDropdown = driver.findElement(By.id("telecom-operator")); Select dropDownOperator = new Select(operatorDropdown); dropDownOperator.selectByIndex(5); //dropDownOperator.getFirstSelectedOption().click(); wait.until(ExpectedConditions.visibilityOf(connectionType)); connectionType.click(); WebElement connectionDropdown = driver.findElement(By.id("connection-type")); Select dropDownConnection = new Select(connectionDropdown); dropDownConnection.selectByIndex(1); amount.sendKeys(rechargeAmount); wait.until(ExpectedConditions.visibilityOf(proceedBtn)); proceedBtn.click(); }}
Base Test:
package pages;import io.github.bonigarcia.wdm.WebDriverManager;import org.openqa.selenium.WebDriver;import org.openqa.selenium.chrome.ChromeDriver;import org.testng.annotations.*;import java.util.concurrent.TimeUnit;public class BaseTest { WebDriver driver; @BeforeSuite public void setup(){ WebDriverManager.chromedriver().setup(); driver = new ChromeDriver(); driver.manage().window().maximize(); driver.navigate().to("https:"); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); } @AfterSuite public void tearDown() throws InterruptedException { Thread.sleep(5000); driver.close(); }}
Login Test:
package pages;import org.testng.annotations.Test;public class LoginTest extends BaseTest{ @Test(priority = 1) public void testLogin() throws InterruptedException { LoginPage loginPage = new LoginPage(driver); loginPage.Login("01791557029", "123456"); Thread.sleep(5000); }}
Recharge Test:
package pages;import org.testng.annotations.Test;public class RechargeTest extends BaseTest{ @Test(priority = 2) public void testRecharge(){ RechargePage rechargePage = new RechargePage(driver); rechargePage.recharge("01687663220", "100"); }}
And here is my TestNG xml file:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"><suite name="All Test Suite" verbose="2" parallel="classes" thread-count="2"><test name="Test Cases"><classes><class name="pages.LoginTest"><methods><include name="testLogin"/></methods></class><class name="pages.RechargeTest"><methods><include name="testRecharge"/></methods></class></classes></test></suite>