Selenium webdriver 将驱动程序对象的单个实例传递给所有其他类(Testng framework)

Selenium webdriver 将驱动程序对象的单个实例传递给所有其他类(Testng framework),selenium-webdriver,testng,Selenium Webdriver,Testng,我在类示例中初始化了一个驱动程序对象。我也想将驱动程序对象传递给其他类,但我得到一个空指针异常。我的代码是 示例类 public class sample { WebDriver driver ; @Test(priority=1) public void openbrowser(){ System.setProperty("webdriver.chrome.driver", "/home/ss4u/De

我在类示例中初始化了一个驱动程序对象。我也想将驱动程序对象传递给其他类,但我得到一个空指针异常。我的代码是

示例类

    public class sample {

    WebDriver driver ;


    @Test(priority=1)

    public void openbrowser(){


        System.setProperty("webdriver.chrome.driver",
                "/home/ss4u/Desktop/Vignesh/jars/chromedriver");

        driver = new ChromeDriver();

        driver.get("http://www.google.com");

        System.out.println(driver instanceof WebDriver);


    }
   @Test(priority=2)
   public void maximize(){

      driver.manage().window().maximize();

   }
   @Test(priority=3)
   public void transfer_instance(){

       sampleone obj=new sampleone(driver);


   }

}
public class Driver {

    public static WebDriver driver=null;



    public static WebDriver startdriver(String browser){


        if(browser.equalsIgnoreCase("Chrome")){

        System.setProperty("webdriver.chrome.driver", "/home/vicky/Documents/Jars/chromedriver");

        driver=new ChromeDriver();

        }else if(browser.equals("Firefox")){

        driver=new FirefoxDriver();

        }
        return driver;

        }

    }
sampleclassone

public class sampleone {

    WebDriver driver;

    public sampleone(WebDriver driver){

        this.driver=driver;

        System.out.println(driver instanceof WebDriver);

        System.out.println(this.driver instanceof WebDriver);

        System.out.println("constructor2");


    }

  public sampleone(){

        System.out.println("Default constructor called");


    }


    @Test(priority=1)

     public void gettitle(){

          System.out.println(this.driver instanceof WebDriver);

          System.out.println(driver instanceof WebDriver);

          String title=this.driver.getTitle();

          System.out.println(this.driver instanceof WebDriver);

          System.out.println(title);

          Assert.assertEquals(title, "Google");

        }

    @Test(priority=2)

    public void navigate(){

        this.driver.get("https:in.yahoo.com");

    }

}
Testng xml文件

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="TestNG" verbose="1" >

    <test name="sample test">
    <classes>
      <class name="testsample.sample" />
    </classes>
    </test>

    <test name="sample testone">
    <classes>
      <class name="testsample.sampleone" />
    </classes>
    </test>

</suite>


当iam不使用创建的对象而是使用testng.xml文件调用类时,会出现此问题。是否有任何可能的方法来创建新的java实例(对于所有类都是通用的)或者在所有类中使用现有实例

我自己找到了一个解决方案…当我详细了解testng时,我发现testng xml文件调用xml文件中指定的所有类的默认构造函数。因此,即使我们将对象传递给另一个类,我们也无法通过对象执行操作,因此空指针异常发生…我发现两种解决方案第一种是使用pagefactory,第二种是为测试套件使用公共驱动程序类…这样我们就可以在所有类中使用相同的驱动程序实例

通用驱动程序类

    public class sample {

    WebDriver driver ;


    @Test(priority=1)

    public void openbrowser(){


        System.setProperty("webdriver.chrome.driver",
                "/home/ss4u/Desktop/Vignesh/jars/chromedriver");

        driver = new ChromeDriver();

        driver.get("http://www.google.com");

        System.out.println(driver instanceof WebDriver);


    }
   @Test(priority=2)
   public void maximize(){

      driver.manage().window().maximize();

   }
   @Test(priority=3)
   public void transfer_instance(){

       sampleone obj=new sampleone(driver);


   }

}
public class Driver {

    public static WebDriver driver=null;



    public static WebDriver startdriver(String browser){


        if(browser.equalsIgnoreCase("Chrome")){

        System.setProperty("webdriver.chrome.driver", "/home/vicky/Documents/Jars/chromedriver");

        driver=new ChromeDriver();

        }else if(browser.equals("Firefox")){

        driver=new FirefoxDriver();

        }
        return driver;

        }

    }

它很容易与extends关键字一起使用,与Java相同。只需创建公共webdriver类,在该类中,您将在TestNG注释的帮助下打开所需的浏览器和应用程序url,如下代码所示

WebDriver通用类:

public class Seleniumlinktext {

    public WebDriver driver;
    String baseurl = "http://www.google.co.in";     

    @BeforeTest
    public void openBrowser(){

        driver = new FirefoxDriver();
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);

    }
public class WebDriverTest extends Seleniumlinktext {   

    @Test(priority=1)
    public void linkText(){
        //images hyperlink      
        driver.findElement(By.linkText("Images")).click();      
        System.out.println("Click on Images hyperlink");

    }
另一个类:

public class Seleniumlinktext {

    public WebDriver driver;
    String baseurl = "http://www.google.co.in";     

    @BeforeTest
    public void openBrowser(){

        driver = new FirefoxDriver();
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);

    }
public class WebDriverTest extends Seleniumlinktext {   

    @Test(priority=1)
    public void linkText(){
        //images hyperlink      
        driver.findElement(By.linkText("Images")).click();      
        System.out.println("Click on Images hyperlink");

    }
通过这种方式,您可以将webdriver实例传递给所有其他类别。我从中找到了解决办法


这里我使用了@BeforeTest注释,因为在使用@Test注释开始执行测试用例之前,我的应用程序url和浏览器应该只打开一次。

在哪里创建对象?我正在示例类中的transfer instance方法中创建对象。。不,我问的是
驱动程序
实例。你能粘贴完整的堆栈异常吗?我在testsample.sampleone.gettitle(sampleone.java:46)上得到下面的异常“空指针异常”。.java.lang.NullPointerException java.lang.NullPointerException发生此异常的原因是对象未调用该类,但当我们使用该对象调用时,它是从testng xml文件调用的。没有问题…我是testng新手。是否有任何方法将一个类的实例传递给另一个类。。。