2017-09-15 59 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"); 
    } 
} 

第二的在上课时,我已经排除了商品,就好像我在课前包括它开启了一个新课程窗口,在这里登录脚本不写

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的代码:

<?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(); 
    } 
} 

什么它做的是它打开浏览器登录,然后什么也不做。我怎样才能让它在同一个浏览器上完成其余的活动,就像我在第二课的课前添加它打开一个新的浏览器,然后在那里我没有登录代码。请指导

+1

更好的是,你可以使用beforeTest和AfterTest代替beforeclass和after –

回答

0

从您所说的看起来,您需要基本上有一个浏览器根据<test>标记生成,然后在所有测试类中共享该浏览器。但是您不能使用@BeforeTest@AfterTest注释,因为您需要在图片中引入继承,并且由于这些方法仅在每个<test>执行一次,您将开始看到NullPointerException

所以这个想法是基本上利用TestNG监听器来实现这个webdriver实例化和清理,并让你的测试类/方法只是从一个辅助方法中查询它们。

下面是一些示例代码,显示了所有这些实际操作。

这里的听众会是什么样子

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(); 
    } 
} 

下面是现在使用上述监听你的测试类怎么能像(我故意保持它的简单和有它打开只是一个网址,但如果你运行它们,你会看到一个浏览器开放多个网址。因此,只有一个浏览器实例)

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")); 
    } 
} 

PageLoader实用工具类看起来像这样

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的样子:

<?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> 

因此,这里没有你的@Test类的调用driver.quit()明确。 webdriver清理由监听器管理。

只有当您想在同一个浏览器上运行多个测试时,此模型才会起作用。

另一方面是,你可以从不并行运行你的@Test方法,因为现在所有的测试共享相同的浏览器。

+0

谢谢,这很好地解释了我如何构建我的测试。 – Maddy

相关问题