【问题标题】:not able to execute second Class from Testng.xml file无法从 Testng.xml 文件执行第二个类
【发布时间】:2016-02-09 16:20:17
【问题描述】:

在 Base 类中,我以 static WebDriver driver = new FirefoxDriver(); 启动浏览器

那我需要在第二类中包含相同的static WebDriver driver = new FirefoxDriver(); 吗?

1 案例:我在第二类中也包含static WebDriver driver = new FirefoxDriver();,但是在执行期间第二类未执行。我在两个班级中也使用了@BeforeMethod@AfterMethod TestNG 注释。但是,它不适合我。如果我在这里做错了什么,请帮助我。

在以下情况下,我想从我停止第一类测试的第二类继续执行测试:

例如,在第一堂课中我登录了应用程序,登录后我现在在主页上。所以现在我想从主页开始进一步执行我的第二堂课。但是,在执行第一类并登录到应用程序后,第二类没有执行。

在“运行套件的结果”选项卡中执行测试套件后,会显示以下类 2 的错误消息:

java.lang.NullPointerException
    at com.proweb.Web2.navigation(ProviderInformation.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
    at org.testng.TestRunner.privateRun(TestRunner.java:767)
    at org.testng.TestRunner.run(TestRunner.java:617)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
    at org.testng.SuiteRunner.access$000(SuiteRunner.java:37)
    at org.testng.SuiteRunner$SuiteWorker.run(SuiteRunner.java:368)
    at org.testng.internal.thread.ThreadUtil$2.call(ThreadUtil.java:64)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

这是我的 testNG XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestSuite" thread-count="2" parallel="tests" >
  <test name="AllTest">
    <classes>
      <class name="com.proweb.web1" />
      <class name="com.proweb.web2" />
    </classes>
  </test>
</suite>

这是我的基类:

package com.proweb;
import java.io.File;
import java.io.IOException;

import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class Web1 {

    public WebDriver driver;
    Workbook wb;
    Sheet sh1;
    int numrow;
    String username;
    String password;

    @BeforeMethod
    public void oneTimeSetUp() {

    static WebDriver driver = new FirefoxDriver();  
    driver.manage().window().maximize();
    driver.get("http://example.com");
    Thread.sleep(1000);
    driver.findElement(By.xpath("//*[@id='app']/div/main/section/ul/li[1]/a")).click();
    Thread.sleep(1000);

    }


    @Test(dataProvider="testdata")
    public void testFireFox(String uname,String password1) throws InterruptedException

    {

    driver.findElement(By.xpath("//input[@name='username']")).clear();
    Thread.sleep(1000);
    driver.findElement(By.xpath("//input[@name='username']")).sendKeys(uname);
    Thread.sleep(1000);
    driver.findElement(By.xpath("//input[@name='password']")).clear();
    Thread.sleep(1000);
    driver.findElement(By.xpath("//input[@name='password']")).sendKeys(password1);
    Thread.sleep(1000);
    driver.findElement(By.xpath("//button[@name='loginButton']")).click();
    Thread.sleep(1000);
    }

    @DataProvider(name="testdata")
    public Object[][] TestDataFeed(){

    try {

    // load workbook
    wb=Workbook.getWorkbook(new File("C://File//Book2.xls"));

    // load sheet in my case I am referring to first sheet only
    sh1= wb.getSheet(0);

    // get number of rows so that we can run loop based on this
    numrow=  sh1.getRows();
    }
    catch (Exception e)

    {
    e.printStackTrace();
    }

    // Create 2 D array and pass row and columns
    Object [][] logindata=new Object[numrow][sh1.getColumns()];

    // This will run a loop and each iteration  it will fetch new row
    for(int i=0;i<numrow;i++){

    // Fetch first row username
        logindata[i][0]=sh1.getCell(0,i).getContents();
    // Fetch first row password
        logindata[i][1]=sh1.getCell(1,i).getContents();

    }

    // Return 2d array object so that test script can use the same
    return logindata;
    }

      @AfterMethod

      public void afterMethod() {

          // Close the driver

          driver.quit();
      }
}

这是我的第二堂课:

package com.proweb;

import java.io.File;
import java.io.IOException;

import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class Web2 {

    public WebDriver driver;
    Workbook wb;
    Sheet sh2;
    int numrow;
    String firstname;
    String middlename;
    String lastname;

    @BeforeMethod
    public void SetUp() {
        static WebDriver driver = new FirefoxDriver();

        driver.findElement(By.xpath("//*[@id='main-navigation']/span[1]")).click();
        Thread.sleep(1000);
        driver.findElement(By.xpath("//*[@id='app']/div/header/nav[1]/div/ul/li/ul/li[2]/a")).click();
        Thread.sleep(1000);
        driver.findElement(By.xpath("//*[@id='app-main']/main/div/div[1]/div/a/span[2]")).click();
        Thread.sleep(1000);
        driver.findElement(By.xpath("//*[@id='-selector_input']")).sendKeys("xyz123xyz");
        Thread.sleep(1000);
        driver.findElement(By.xpath("//*[@id='selector_listbox__option__0']")).click();
        Thread.sleep(1000);
        driver.findElement(By.xpath("//*[@id='app-main']/main/div/div[3]/button")).click();
        Thread.sleep(3000);
        }




    @Test(dataProvider="testdata")
    public void testProvidername(String fname,String mname,String lname) throws InterruptedException

    {

    driver.findElement(By.xpath("//*[@id='nameFirst']")).clear();
    Thread.sleep(1000);
    driver.findElement(By.xpath("//*[@id='nameFirst']")).sendKeys(fname);
    Thread.sleep(1000);
    driver.findElement(By.xpath("//*[@id='nameMiddle']")).clear();
    Thread.sleep(1000);
    driver.findElement(By.xpath("//*[@id='nameMiddle']")).sendKeys(mname);
    Thread.sleep(1000);
    driver.findElement(By.xpath("//*[@id='nameLast']")).click();
    Thread.sleep(1000);
    driver.findElement(By.xpath("//*[@id='nameLast']")).sendKeys(lname);
    Thread.sleep(1000);
    }

    @DataProvider(name="testdata")
    public Object[][] TestDataFeed(){

    try {

    // load workbook
    wb=Workbook.getWorkbook(new File("C://File//Book2.xls"));

    // load sheet in my case I am referring to first sheet only
    sh2= wb.getSheet(1);

    // get number of rows so that we can run loop based on this
    numrow=  sh2.getRows();
    }
    catch (Exception e)

    {
    e.printStackTrace();
    }

    // Create 2 D array and pass row and columns
    Object [][] Peinformationdata=new Object[numrow][sh2.getColumns()];

    // This will run a loop and each iteration  it will fetch new row
    for(int i=0;i<numrow;i++){

    // Fetch first row username
        Peinformationdata[i][0]=sh2.getCell(0,i).getContents();
    // Fetch first row password
        Peinformationdata[i][1]=sh2.getCell(1,i).getContents();

        Peinformationdata[i][2]=sh2.getCell(2,i).getContents();

    }

    // Return 2d array object so that test script can use the same
    return Peinformationdata;
    }

      @AfterMethod

      public void afterMethod() {

          // Close the driver

          driver.quit();
      }

}

【问题讨论】:

    标签: java selenium testing testng jxl


    【解决方案1】:

    根据提供的示例,您在每个类中启动 webdriver 并在该类中退出相同的。如果您要在两个类中使用相同的 webdriver,那么最好在一个单独的类中启动 webdriver,然后将该类扩展到您的测试用例类(除了您的基础类和第二类)。

    让我们看一个简单的例子,我将创建一个类配置来启动我的 webdriver

     public class config{
    
    static WebDriver driver;
    
    @BeforeSuite
    public void setup(){
    
        driver=new FirefoxDriver();
    
    }
    
    @AfterSuite
    public void tearDown(){
        driver.quit();
    }
    
    }
    

    现在,我将把这个类扩展到我的测试用例/类

       public class NewTest1 extends config{
    
       @Test
       public void test1() {
       driver.get("http://www.google.com");
       }
      }
    

    另一个班级

      public class NewTest2 extends config{
    
    @Test
    public void MyTesting() {
             driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
      }
    }
    

    现在,从 tesng.xml 执行这两个类,请注意使用 preserve-order="true" 按指定顺序执行测试用例/类

    <?xml version="1.0" encoding="UTF-8"?>
     <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
     <suite name="Suite" parallel="false" preserve-order="true">
    
      <test name="TestA">
        <classes>
          <class name="com.test.NewTest1"/>
          <class name="com.test.NewTest2"/>
        </classes>
      </test> <!-- Test -->
     </suite> <!-- Suite -->
    

    谢谢你, 壁画

    【讨论】:

    • 您好 Murali seleniumtrainer,-我更新了类配置,我的代码和您的解决方案对我有用。非常感谢!!!
    • 很高兴知道你很高兴.. 谢谢
    • 嗨 Shubham Jain - 我不能投票支持 Murali 的建议,因为我还没有获得至少 15 点声望。将投票一次,我将使它达到 15 声望。
    猜你喜欢
    • 2019-10-20
    • 1970-01-01
    • 2018-06-24
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2013-08-04
    相关资源
    最近更新 更多