我想从TestNG运行不同的类特定方法,但每次在每个类中包含beforeclass时它都会打开一个新窗口

时间:2017-09-15 12:15:21

标签: selenium-webdriver testng testng-eclipse

我想从TestNG运行不同的类特定方法,但每当我在每个类中包含beforeclass时它每次打开一个新窗口,所以我现在已经从add和logout类中排除了beforeclass,所以它可以使用相同的浏览器来运行rest方法但是它的不工作

第一个类是登录类,如下所示

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 个答案:

答案 0 :(得分:0)

根据您的说法,您似乎需要基本上每个<test>标记生成一个浏览器,然后在所有测试类中共享该浏览器。但是您无法使用@BeforeTest@AfterTest注释,因为您需要将继承引入图片中,因为这些方法每<test>只执行一次,您将开始看NullPointerException 1}}。

因此,我们的想法是基本上利用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();
    }
}

以下是现在使用上述监听器的测试类的外观(我故意保持简单,只打开一个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"));
    }
}

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方法,因为现在所有测试都共享同一个浏览器。