Comment exécuter plusieurs cas de test avec un cas de test de connexion dans selenium WD avec TestNG
Salut j'ai trois fichiers de classe. En première classe, un seul cas de test est utilisé pour le compte login Gmail . le reste des classes n'ayant qu'un seul cas de test et les deux sont utilisés pour naviguer dans Inbox et les éléments envoyés. J'ai créé testng.xml
pour exécuter ces plusieurs classes. Maintenant, le problème est que lorsque la première classe est en cours d'exécution, je pourrais me connecter au compte Gmail. Mais en ce qui concerne la deuxième classe, je ne peux pas naviguer vers Boîte de réception car je n'ai pas effectué d'opération de connexion dans classe 2 et classe 3.
Donc cela m'a jeté une erreur Null Pointer Exception
. Je connais la raison pour laquelle j'obtiens cette exception. Mais je veux effectuer une action de connexion une seule fois, mais elle devrait être disponible pour toutes les classes, ce qui signifie que lorsque je vais exécuter les classes 2 et 3, elle ne devrait pas générer d'erreur. Il devrait continuer à partir de la classe 1. Comment je peux réaliser cette tâche.
J'ai beaucoup googlé. Aucun d'eux ne m'a aidé. Veuillez me suggérer n'importe quelle idée si vous avez. J'ai essayé de prolonger ma classe aussi. J'ai eu pas de résultat. Veuillez me guider où je me bats?
Voici mon testng.xml
<suite name="MynaTestCase">
<test name="order">
<classes>
<class name="myPackage.Login" />
<class name="myPackage.Inbox" />
<class name="myPackage.SentItems" />
</classes>
</test>
</suite>
Voici le Code de Connexion
@BeforeSuite(alwaysRun = true)
public void setup(){
System.setProperty("webdriver.chrome.driver", "/home/vadmin/workspace/samplepjt/lib/chromedriver");
driver = new ChromeDriver();
baseUrl = "http://www.google.com";
driver.get(baseUrl+"/");
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
System.out.println("Before suite executed");
}
@Test
public void LoginTest(){
driver.findElement(By.cssSelector("i.fa.fa-user-secret")).click();
driver.findElement(By.id("user_username")).clear();
driver.findElement(By.id("user_username")).sendKeys(username);
driver.findElement(By.id("user_password")).clear();
driver.findElement(By.id("user_password")).sendKeys(password);
driver.findElement(By.id("signInButton")).click();
}
Voici la Boîte de réception.Java
@Test
public void testcase1()
{
driver.findElement(By.xpath("html/body/div[1]/div[2]/div/div/div/div[1]/div[4]/ul/li[8]/a/div/p")).click();
Assert.assertEquals(driver.findElement(By.xpath("html/body/div[1]/div[2]/div/div/div/div[2]/div/h4")).getText(), "Sections");
driver.findElement(By.name("commit")).click();
driver.findElement(By.xpath(".//*[@id='new_section']/div[3]/input")).submit();
}
1 answers
Le problème est que vous avez défini votre WebDriver dans la classe Login, donc la classe Inbox ne le verra pas.
Pour le résoudre, créez une classe abstraite, qui inclut les classes BeforeSuite
et AfterSuite
et étendez chaque classe de test avec elle.
Classe Abstraite
public class MyAbstractClass
{
public WebDriver driver;
@BeforeSuite
public void beforeSuite() {
//...
this.driver = new ChromeDriver();
//...
}
@AfterSuite
public void afterSuite() {
//...
this.driver.quit();
//...
}
}
Une Classe De Test
public class MyTestClass extends MyAbstractClass
{
@Test
public void myTest() {
this.driver.get("http://google.com");
}
}