Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在TestNG WebDriver Java中将调用的WebDriver从@BeforeMethod传递到@Test_Java_Selenium_Webdriver_Testng - Fatal编程技术网

如何在TestNG WebDriver Java中将调用的WebDriver从@BeforeMethod传递到@Test

如何在TestNG WebDriver Java中将调用的WebDriver从@BeforeMethod传递到@Test,java,selenium,webdriver,testng,Java,Selenium,Webdriver,Testng,我有这个班的签名: package automationFramework; import java.util.concurrent.TimeUnit; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.ie.Inter

我有这个班的签名:

package automationFramework;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

import pageObject.devSplashScreenPage;
import utility.BrowserType;
import utility.Constant;
import appModule.SignIn_Action;

public class SignIn {

    public WebDriver driver;



@BeforeMethod
@Parameters("browser")
public void SetUp(String browser) {

    BrowserType.Execute(driver, browser);

}

@Test
public  void signIn() {

    // Call Sign In function
    SignIn_Action.Execute(driver, Constant.StudentUsername, Constant.StudentPassword);    
 }  

@AfterMethod
public void Teardown() {
      driver.quit();

} 

  }
我在下面调用这段代码,它通过传递的参数选择特定的浏览器。它工作得非常好,它选择正确的浏览器并执行

package utility;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class BrowserType {



    @Test
    public static void Execute(WebDriver driver, String browser) {

         // Set Browsers
         if(browser.equalsIgnoreCase("firefox")) {
         driver = new FirefoxDriver();
         }

         else if (browser.equalsIgnoreCase("chrome")) { 

         {System.setProperty("webdriver.chrome.driver","C:/Users/elsid/Desktop/Eclipse/Selenium/chromedriver.exe");}
          driver = new ChromeDriver();        
          }

         else if (browser.equalsIgnoreCase("ie")) { 

              {System.setProperty("webdriver.ie.driver","C:/Users/elsid/Desktop/Eclipse/Selenium/IEDriverServer.exe");}
              driver = new InternetExplorerDriver(); 
              {DesiredCapabilities iecapabilities = DesiredCapabilities.internetExplorer();
              iecapabilities.setCapability(InternetExplorerDriver.IE_ENSURE_CLEAN_SESSION, true);}
              }

          // Implicit Wait and Maximize browser
          driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
          driver.manage().window().maximize();

          // Navigate to URL
          driver.get(Constant.URL);


    } 

    }
所以@BeforeMethod中的所有操作都执行得非常好,我遇到的问题是测试停止,因为驱动程序没有从@BeforeMethod传递到@test

如何将通过运行BrowserType.class启动的驱动程序放入@Test Sign\u in.class。我想我怎样才能正确地从browsertype返回驱动程序并在Sign_in@Test中调用它


谢谢你,你做事的方式可以大大改进

public class BrowserTest extends TestBase{
    @Test(dataProvider="test1")
    public static void execute(WebDriverHelper helper, String browser) {
         // Set Browsers
         driver.get(url);
只需传递来自数据提供程序的驱动程序对象。我假设您在DataProvider方法中生成驱动程序实例,因为您的测试方法已经参数化并接受驱动程序

public class TestBase {
    private WebDriver driver;
    ...
    @BeforeMethod
    @Parameters("browser")
    public void setUp(Object[] params) {
        driver = (WebDriverHelper)params.get(1);
        browserName = (String)params.get(2);
        this.setTestName( params.get(0) + "-" + browserName;
        driver.navigateTo(startUrl);    
    }
我上面展示的代码不会编译,但我在这里试图传达的是,您需要对@BeforeMethod方法使用可选的TestNG arg,即Object[],并且它允许您在调用测试方法之前访问传递给测试方法的对象,例如访问在DataProvider工厂中创建的驱动程序助手,然后在测试运行之前对其进行一些功能设置

@DataProvider(name = "test1")
public Object[][] createData1() {
 return new Object[][] { 
   { "Cedric", new WebDriverHelper(), "firefox" },
   { "Anne", new WebDriverHelper(), "chrome"}
 }; 
} 
您应该让Execute函数返回驱动程序:

public static WebDriver Execute(String browser) {
    ...
    return driver;
}
在您的测试中:

public void SetUp(String browser) {
    driver = BrowserType.Execute(browser);
}
这样解决:

BrowserType.java:

package utility;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class BrowserType {

    @Test
    public static WebDriver Execute(String browser) {

         // Set Browsers
         WebDriver driver = null;
         if(browser.equalsIgnoreCase("firefox")) {
         driver = new FirefoxDriver();
         }

         else if (browser.equalsIgnoreCase("chrome")) { 

         {System.setProperty("webdriver.chrome.driver","C:/Users/elsid/Desktop/Eclipse/Selenium/chromedriver.exe");}
          driver = new ChromeDriver();        
          }

         else if (browser.equalsIgnoreCase("ie")) { 

              {System.setProperty("webdriver.ie.driver","C:/Users/elsid/Desktop/Eclipse/Selenium/IEDriverServer.exe");}
              driver = new InternetExplorerDriver(); 
              {DesiredCapabilities iecapabilities = DesiredCapabilities.internetExplorer();
              iecapabilities.setCapability(InternetExplorerDriver.IE_ENSURE_CLEAN_SESSION, true);}
              }

          // Implicit Wait and Maximize browser
          driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
          driver.manage().window().maximize();

          // Navigate to URL
          driver.get(Constant.URL);

          return driver;

    } 
SignIn.java类:

package automationFramework;

    import java.util.concurrent.TimeUnit;

    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.ie.InternetExplorerDriver;
    import org.openqa.selenium.remote.DesiredCapabilities;
    import org.openqa.selenium.support.ui.ExpectedConditions;
    import org.openqa.selenium.support.ui.WebDriverWait;
    import org.testng.annotations.AfterMethod;
    import org.testng.annotations.BeforeMethod;
    import org.testng.annotations.Parameters;
    import org.testng.annotations.Test;

    import pageObject.devSplashScreenPage;
    import utility.BrowserType;
    import utility.Constant;
    import appModule.SignIn_Action;

    public class SignIn {

    public WebDriver driver;



    @BeforeMethod
    @Parameters("browser")
    public void SetUp(String browser) {

        driver = BrowserType.Execute(browser);

    }

    @Test
    public  void signIn() {

        // Call Sign In function
        SignIn_Action.Execute(driver, Constant.StudentUsername, Constant.StudentPassword);    
     }  

    @AfterMethod
    public void Teardown() {
          driver.quit();

    } 

      }

我以前试过把司机还给他,但没用。它给了我一个错误void方法不能返回一个值实际上我根本没有使用@Dataproviders。我理解。我只是想建议,如果您不使用Spring,那么使用DataProvider可以使驱动程序实例的多线程处理变得更容易。是的,我将来必须研究数据提供程序。您的.Execute方法不应该是一个带测试注释的方法。相反,BrowserType类应该是SignIn类扩展的抽象类。然后,您可以将安装方法放在BrowserType类中,而不是放在SignIn测试类中。您能提供一些代码吗?我真的不明白。ThanksIt只是基本的多态性:
public class TestSuiteDriver {

    private static WebDriver driver;

    @BeforeClass
    public static void setUp(){
        System.setProperty("webdriver.chrome.driver", "/Users/Kimberleyross/chromedriver");
        driver = new ChromeDriver();
    }

    public static WebDriver getDriver() {
        return TestSuiteDriver.driver;
    }
}