2017-09-15 8 views
0

TestNG에서 다른 클래스의 특정 메서드를 실행하려고하지만 각 클래스에 beforeclass를 포함 할 때마다 새 창이 열립니다. 그 나머지 방법하지만이 첫 번째 클래스는TestNG에서 다른 클래스의 특정 메서드를 실행하려고 할 때마다 각 클래스에 beforeclass를 포함 할 때 새 창을 열 때마다

public class LoginWeb { 
    public WebDriver driver; 
    WebDriverWait wait; 
    LoginScreen loginExcel; 
    @BeforeClass 
    public void beforeClass(){ 
     System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe"); 
     driver=new ChromeDriver(); 
     driver.manage().window().maximize(); 
     driver.get("http://10.7.1.180/views/index.html#/login"); 
     System.out.println(driver.getTitle()); 
    } 

    @Test (description = "Valid Credentials!") 
    public void LoginWithValidWebExcelEmailAndPass() throws IOException, BiffException { 
     loginExcel= new LoginScreen(driver); 
     FileInputStream fi = new FileInputStream("D:\\Programs\\New\\Sourcesmartdata.xls"); 
     Workbook w = Workbook.getWorkbook(fi); 
     Sheet s = w.getSheet(0); 
     int z = s.getRows(); 
     System.out.println("no of rows------------------------:"+z); 
     String email = s.getCell(0, 1).getContents(); 
     System.out.println("Email -----------------"+email); 
     loginExcel.EnterEmail(email); 
     String password= s.getCell(1, 1).getContents(); 
     System.out.println("Password------------------- "+password); 
     loginExcel.EnterPassword(password); 
     loginExcel.ClickToLogin(); 
     wait= new WebDriverWait(driver, 10); 
     WebElement GetLogo = wait.until(ExpectedConditions.visibilityOf(loginExcel.TopRightMenu)); 
     String str= GetLogo.getText(); 
     System.out.println("Text------------"+str); 
     Assert.assertEquals(str, "Source Smart"); 
    } 
} 

두 번째 다음과 같다 로그인 클래스입니다

을 작동하지를 실행하는 동일한 브라우저를 사용할 수 있도록 클래스는 그래서 지금 추가 및 로그 아웃 클래스에서 beforeclass을 제외한 클래스는 여기에 상품을 추가하는 것입니다. 클래스를 시작하기 전에 클래스를 포함하는 것처럼 beforeclass를 제외 시켰습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> 
<suite name="Suite"> 
    <test name="Login check"> 
    <classes> 
     <class name="SourceSmartWeb.LoginWeb"/> 
     <class name = "SourceSmartWeb.AddCommoditiesWeb"> 
     <methods> 
     <include name="AddMultipleNewCommodities"/> 
     </methods> 
     </class> 
     <class name ="SourceSmartWeb.LogoutWeb"/> 
    </classes> 
    </test> <!-- Test --> 
</suite> <!-- Suite --> 

로그 아웃 클래스 :

public class LogoutWeb{ 
    WebDriver driver; 
    // @BeforeClass 
    // public void beforeClass(){ 
    //  System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe"); 
    //  driver=new ChromeDriver(); 
    //  driver.manage().window().maximize(); 
    //  driver.get("http://10.7.1.180/views/index.html#/login"); 
    //  System.out.println(driver.getTitle()); 
    //  super.beforeClass(); 
    //   
    // } 


    @Test                          
    public void Logout() throws InterruptedException { 
     LogoutScreen logout=new LogoutScreen(driver); 
     logout.ClickToLogout(); 
    } 

    @AfterClass 
    public void exit(){ 
     driver.quit(); 
    } 
} 

의 행함가 브라우저 로그인을 열고 다음 아무것도하지 않고 무엇 창 여기에서 로그인 스크립트는

public class AddCommoditiesWeb{ 
    WebDriver driver; 
    WebDriverWait wait; 
    AddCommodities addcommodity; 

    @Test (description="Add Multiple Commodities!") 
    public void AddMultipleNewCommodities() throws Exception, Exception{ 
     addcommodity = new AddCommodities(driver); 
     addcommodity.MenuCommodities();  //click left menu to open manage commodities page 
     FileInputStream fi = new FileInputStream("D:\\Programs\\New\\Sourcesmartdata.xls"); 
     Workbook w = Workbook.getWorkbook(fi); 
     Sheet s = w.getSheet(1); 
     int z=s.getRows(); 
     System.out.println("no of rows------------------------:"+z); 
     for(int row=1; row <2; row++){ 
      Thread.sleep(5000); 
      addcommodity.ClickAddCommodities(); // click add commodity button 
      String commodityname = s.getCell(0, row).getContents(); 
      System.out.println("commodityname -----------------"+commodityname); 
      //enterdefinecommodityTxtBox.sendKeys(commodityname); 
      addcommodity.Enterdefinecommodity(commodityname); 
      String grade= s.getCell(1, row).getContents(); 
      System.out.println("grade------------------- "+grade); 
      //entergradeTxtBox.sendKeys(grade); 
      String unit= s.getCell(2, row).getContents(); 
      System.out.println("unit------------------- "+unit); 
      //enterunitTxtBox.sendKeys(unit); 
      String minprice= s.getCell(3, row).getContents(); 
      System.out.println("min price------------------- "+minprice); 
      //enterminpriceTxtBox.sendKeys(minprice); 
      String maxprice= s.getCell(4, row).getContents(); 
      System.out.println("max price------------------- "+maxprice); 
      //entermaxpriceTxtBox.sendKeys(maxprice); 
      addcommodity.EnterAddCommoditiesData(grade,unit,minprice,maxprice); 
     } 
     wait=new WebDriverWait(driver,10); 
     WebElement commodityname= wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("/html/body/div/div[4]/div/section[2]/div[4]/d-expand-collapse[1]/div/div/div[1]/h4/a")));   
     String commoditynamejustadded= commodityname.getText(); 
     System.out.println("name--------------"+commoditynamejustadded); 
     assertEquals(commoditynamejustadded, "Rice"); 
    } 
} 

TestNG의 코드를 작성하지 않습니다. 어떻게하면 두 번째 클래스에서 클래스를 추가하기 전에 새 브라우저를 연 다음 로그인 코드가없는 것처럼 동일한 브라우저에서 나머지 작업을 수행 할 수 있습니다. 제발 도와주세요

+1

beforeTest와 afterTest 대신에 beforeclass와 after class를 사용하면됩니다. –

답변

0

당신이 진술하고있는 것을 보면 기본적으로 <test> 태그 당 생성 된 브라우저를 가지고 모든 브라우저에서 그 브라우저를 공유해야하는 것처럼 보입니다. 그러나 @BeforeTest@AfterTest 주석을 사용할 수 없습니다. 그림에 상속을 가져와야하기 때문에 <test> 당 한 번만 실행되기 때문에 NullPointerException이 표시되기 시작합니다.

기본적으로이 webdriver 인스턴스화 및 정리에 대해 TestNG 수신기를 활용하고 테스트 클래스/메소드가 도우미 메소드 내에서 쿼리하도록해야합니다.

다음은이 코드를 보여주는 샘플 코드입니다. 여기

는 청취자의 모습 방법

다음
package com.rationaleemotions.stackoverflow.qn46239358; 

import org.openqa.selenium.chrome.ChromeDriver; 
import org.openqa.selenium.remote.RemoteWebDriver; 
import org.testng.ITestContext; 
import org.testng.ITestResult; 
import org.testng.Reporter; 
import org.testng.TestListenerAdapter; 

public class WebdriverSpawner extends TestListenerAdapter { 
    private static final String WEBDRIVER = "webdriver"; 

    @Override 
    public void onStart(ITestContext testContext) { 
     testContext.setAttribute(WEBDRIVER, createDriver()); 
    } 

    @Override 
    public void onFinish(ITestContext testContext) { 
     getWebDriverFromContext(testContext).quit(); 
    } 

    public static RemoteWebDriver getCurrentWebDriver() { 
     ITestResult result = Reporter.getCurrentTestResult(); 
     if (result == null) { 
      throw new IllegalStateException("Please invoke this from within a @Test annotated method"); 
     } 
     ITestContext context = result.getTestContext(); 
     return getWebDriverFromContext(context); 
    } 

    private static RemoteWebDriver getWebDriverFromContext(ITestContext context) { 
     Object object = context.getAttribute(WEBDRIVER); 
     if (!(object instanceof RemoteWebDriver)) { 
      throw new IllegalStateException("Encountered problems in retrieving the webdriver instance"); 
     } 
     return (RemoteWebDriver) object; 

    } 

    private static RemoteWebDriver createDriver() { 
     return new ChromeDriver(); 
    } 
} 

지금이 위의 리스너를 사용하여 테스트 클래스 (나는 의도적으로하면 간단하게 유지하고 그냥 URL을 열어 가지고 있지만 한 모습 수있는 방법 당신은 당신이 여러 URL을 단일 브라우저 개방을 알 것을 실행합니다. 그래서 하나 개의 브라우저 인스턴스를)

package com.rationaleemotions.stackoverflow.qn46239358; 

import org.testng.annotations.Test; 

public class LoginWeb { 
    @Test(description = "Valid Credentials!") 
    public void LoginWithValidWebExcelEmailAndPass() { 
     System.err.println("Page title : " + PageLoader.loadAndGetTitle("http://www.google.com")); 
    } 
} 
package com.rationaleemotions.stackoverflow.qn46239358; 

import org.testng.annotations.Test; 

public class LogoutWeb { 
    @Test 
    public void Logout() throws InterruptedException { 
     System.err.println("Page title : " + PageLoader.loadAndGetTitle("http://www.facebook.com")); 
    } 
} 
package com.rationaleemotions.stackoverflow.qn46239358; 

import org.testng.annotations.Test; 

public class AddCommoditiesWeb { 

    @Test(description = "Add Multiple Commodities!") 
    public void AddMultipleNewCommodities() { 
     System.err.println("Page title : " + PageLoader.loadAndGetTitle("http://www.yahoo.com")); 
    } 

    @Test 
    public void anotherTestMethod() { 
     System.err.println("Page title : " + PageLoader.loadAndGetTitle("http://www.ndtv.com")); 
    } 
} 
당신의 @Test 클래스 중 누구도 명시 적으로 driver.quit()를 호출하지 그래서 여기

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> 
<suite name="46216357_Suite" verbose="2"> 
    <listeners> 
     <listener class-name="com.rationaleemotions.stackoverflow.qn46239358.WebdriverSpawner"/> 
    </listeners> 

    <test name="Login_check"> 
     <classes> 
      <class name="com.rationaleemotions.stackoverflow.qn46239358.LoginWeb"/> 
      <class name="com.rationaleemotions.stackoverflow.qn46239358.AddCommoditiesWeb"> 
       <methods> 
        <include name="AddMultipleNewCommodities"/> 
       </methods> 
      </class> 
      <class name="com.rationaleemotions.stackoverflow.qn46239358.LogoutWeb"/> 
     </classes> 
    </test> 
</suite> 

package com.rationaleemotions.stackoverflow.qn46239358; 

import org.openqa.selenium.remote.RemoteWebDriver; 

public final class PageLoader { 

    private PageLoader() { 
     //Utility class defeat instantiation 
    } 
    public static String loadAndGetTitle(String url) { 
     RemoteWebDriver driver = WebdriverSpawner.getCurrentWebDriver(); 
     driver.get(url); 
     return driver.getTitle(); 
    } 
} 

는 다음과 같은 제품군의 XML이 어떻게 보이는지처럼

PageLoader 유틸리티 클래스 보인다. webdriver cleanup은 리스너에 의해 관리됩니다.

이 모델은 동일한 브라우저에서 여러 테스트를 실행하려는 경우에만 작동합니다.

NEVER@Test 메서드를 병렬로 실행할 수 있습니다. 모든 테스트가 동일한 브라우저를 공유하기 때문에 가능합니다.

+0

감사합니다. 내 테스트를 빌드하는 방법을 잘 설명해 주셨습니다. – Maddy