Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.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
Java 如何将selenium webdriver实例传递给另一个类_Java_Selenium_Selenium Webdriver - Fatal编程技术网

Java 如何将selenium webdriver实例传递给另一个类

Java 如何将selenium webdriver实例传递给另一个类,java,selenium,selenium-webdriver,Java,Selenium,Selenium Webdriver,我浏览了这个网站,但没有找到我正在寻找的答案 我有 超级基类-这里我只是创建一个webdriver的对象 基类-在这个类中,我扩展了Superbase类,调用驱动程序并打开URL Clicklink类-在这个类中,我再次扩展了Superbase类,但只发现了一个空指针异常。我想我得到了异常,因为驱动程序对象没有初始化 我只是一个初学者,还没有尝试过browserfactory和其他选项,因为我想从简单的流开始 超类 Public class Superclass { public

我浏览了这个网站,但没有找到我正在寻找的答案

我有

  • 超级基类-这里我只是创建一个webdriver的对象
  • 基类-在这个类中,我扩展了Superbase类,调用驱动程序并打开URL
  • Clicklink类-在这个类中,我再次扩展了Superbase类,但只发现了一个空指针异常。我想我得到了异常,因为驱动程序对象没有初始化
  • 我只是一个初学者,还没有尝试过browserfactory和其他选项,因为我想从简单的流开始

    超类

        Public class Superclass
        {
    public webdriver Driver;
    }
    
    基类

    public class Baseclass extends Superclass
    {
    setting capabilities and launching the browser
    }
    
    点击链接

    public class Clicklink extends Superclass
    {
    here I want to click on a link
    driver.findelement(by.xpath("xpath").click());
    // after this statement I get a null pointer exception
    }
    
    你能带我到这里吗?我怎样才能达到同样的效果


    多谢

    超类
    基类
    是非常糟糕的名称。不要用编码语言来命名你的类,使用问题语言。在本例中,对网站应用程序进行测试时,请使用LoginPage、CartPage、ProfilePage等

    我建议您使用Factory模式为每个测试提供WebDriver实例。因为所有这些都符合页面的概念,所以使用来自标准PageObject的类扩展来提供此功能。导航时,让当前页面构造新页面的实例,并将当前
    webDriver
    连接实例传递给它。然后,应用于该页面对象的任何操作都将自动应用于该webDriver实例及其关联的浏览器实例。您还应该使用
    PageFactory
    来提供pageObject的实例

    public abstract class PageObject {
        public WebDriver driver;
        PageObject() {
            // Page can initialise its self
            this.driver = BrowserFactory.webDriver();
        }
        PageObject(final WebDriver webDriver) {
            this.driver = webDriver;
            }
        }
    

    超类
    基类
    是非常糟糕的名称。不要用编码语言来命名你的类,使用问题语言。在本例中,对网站应用程序进行测试时,请使用LoginPage、CartPage、ProfilePage等

    我建议您使用Factory模式为每个测试提供WebDriver实例。因为所有这些都符合页面的概念,所以使用来自标准PageObject的类扩展来提供此功能。导航时,让当前页面构造新页面的实例,并将当前
    webDriver
    连接实例传递给它。然后,应用于该页面对象的任何操作都将自动应用于该webDriver实例及其关联的浏览器实例。您还应该使用
    PageFactory
    来提供pageObject的实例

    public abstract class PageObject {
        public WebDriver driver;
        PageObject() {
            // Page can initialise its self
            this.driver = BrowserFactory.webDriver();
        }
        PageObject(final WebDriver webDriver) {
            this.driver = webDriver;
            }
        }
    

    若您不想将驱动程序实例传递给页面对象构造函数,那个么可以为驱动程序创建一些容器类,并将其放在测试之前,然后在运行之后将其删除。例如:

    class Driver {
        public static ThreadLocal<IWebDriver> driverInstance = new ThreadLocal<IWebDriver>();
    
        public static IWebDriver GetDriver() {
            return driverInstance.Value;
        }
    
        public static void SetDriver(IWebDriver driver) {
            driverInstance.Value = driver;
        }
    }
    
    类驱动程序{
    public static ThreadLocal driverInstance=new ThreadLocal();
    公共静态IWebDriver GetDriver(){
    返回driverInstance.Value;
    }
    公共静态无效设置驱动程序(IWebDriver驱动程序){
    driverInstance.Value=驱动程序;
    }
    }
    

    并创建此容器字段以避免并行运行时出现问题。

    如果您不想将驱动程序实例传递给页面对象构造函数,则可以为驱动程序创建一些容器类,并将其放在测试之前,然后在运行之后将其删除。例如:

    class Driver {
        public static ThreadLocal<IWebDriver> driverInstance = new ThreadLocal<IWebDriver>();
    
        public static IWebDriver GetDriver() {
            return driverInstance.Value;
        }
    
        public static void SetDriver(IWebDriver driver) {
            driverInstance.Value = driver;
        }
    }
    
    类驱动程序{
    public static ThreadLocal driverInstance=new ThreadLocal();
    公共静态IWebDriver GetDriver(){
    返回driverInstance.Value;
    }
    公共静态无效设置驱动程序(IWebDriver驱动程序){
    driverInstance.Value=驱动程序;
    }
    }
    

    并创建此容器字段以避免并行运行时出现问题。

    我这边做了很多猜测,但请确保您的超类确实设置了驱动程序并返回它。实际上,您可以通过两种方法实现:

    public class Superclass
    {
      public WebDriver driver;
      public Superclass(){
        driver = new FirefoxDriver();
      }
      public WebDriver getdriver(){
        if (driver == null){
          driver = new FirefoxDriver();
          return driver;
        }else{
          return driver;
        }
      }
    }
    
    稍后在您调用它的方法中:

    public class Clicklink extends Superclass
    {
    
    getdriver().findelement(by.xpath("xpath").click());
    
    }
    

    我这边做了很多猜测,但请确保您的超类确实设置了驱动程序并返回它。实际上,您可以通过两种方法实现:

    public class Superclass
    {
      public WebDriver driver;
      public Superclass(){
        driver = new FirefoxDriver();
      }
      public WebDriver getdriver(){
        if (driver == null){
          driver = new FirefoxDriver();
          return driver;
        }else{
          return driver;
        }
      }
    }
    
    稍后在您调用它的方法中:

    public class Clicklink extends Superclass
    {
    
    getdriver().findelement(by.xpath("xpath").click());
    
    }
    

    在这个问题上,我采取了与大多数人稍有不同的方法。启动测试会话时,我将浏览器名称作为参数传递(即-Dbrowser=chrome),以便能够使用不同的浏览器测试我的web应用程序。然后,当我的测试框架调用
    setup()
    时,我使用“browser”系统属性获取浏览器名称。在我的例子中,我使用JUnit注释以便JUnit在运行任何测试之前设置所有需要的依赖项

    @BeforeClass
    public static void setup() throws Exception {
        // Set up other stuff
        String browser = System.getProperty("browser");
        try {
            SessionDataProvider.driver = TestUtils.createDriver(browser);
        } catch (Exception e) {
            ...
        }
    }
    
    createDriver(String)
    是一个工厂方法,用于实例化正确的驱动程序

    public static WebDriver createDriver(String browserName) throws Exception {
        WebDriver driver = null;
        try {
            switch(browserName) {
            case "firefox":
                // code to system props and instantiate the driver
                break;
            case "chrome":
                // code to system props and instantiate the driver
                break;
            case "ibrowser":
                // code to system props and instantiate the driver
                break;
            case "edge":
                // code to system props and instantiate the driver
                break;
            case "safari":
                // code to system props and instantiate the driver
                break;
            default:
                throw new Exception("Unsupported browser: " + browserName);
            }
        return driver;
    }
    
    然后,当我执行步骤定义时,我只需从数据提供程序类获取驱动程序:

    @And("(I click)/Click on {string}")
    public void click(String arg) {
    
        // Parse String arg and create web element locator...
        try {
            By locator = ...;
            WebElement element = new WebDriverWait(SessionDataProvider.driver, 2)
                .until(ExpectedConditions.elementToBeClickable(locator));
            element.click();
        } catch (Exception e) {
            // handle exception
        }
    }
    

    在这个问题上,我采取了与大多数人稍有不同的方法。启动测试会话时,我将浏览器名称作为参数传递(即-Dbrowser=chrome),以便能够使用不同的浏览器测试我的web应用程序。然后,当我的测试框架调用
    setup()
    时,我使用“browser”系统属性获取浏览器名称。在我的例子中,我使用JUnit注释以便JUnit在运行任何测试之前设置所有需要的依赖项

    @BeforeClass
    public static void setup() throws Exception {
        // Set up other stuff
        String browser = System.getProperty("browser");
        try {
            SessionDataProvider.driver = TestUtils.createDriver(browser);
        } catch (Exception e) {
            ...
        }
    }
    
    createDriver(String)
    是一个工厂方法,用于实例化正确的驱动程序

    public static WebDriver createDriver(String browserName) throws Exception {
        WebDriver driver = null;
        try {
            switch(browserName) {
            case "firefox":
                // code to system props and instantiate the driver
                break;
            case "chrome":
                // code to system props and instantiate the driver
                break;
            case "ibrowser":
                // code to system props and instantiate the driver
                break;
            case "edge":
                // code to system props and instantiate the driver
                break;
            case "safari":
                // code to system props and instantiate the driver
                break;
            default:
                throw new Exception("Unsupported browser: " + browserName);
            }
        return driver;
    }
    
    然后,当我执行步骤定义时,我只需从数据提供程序类获取驱动程序:

    @And("(I click)/Click on {string}")
    public void click(String arg) {
    
        // Parse String arg and create web element locator...
        try {
            By locator = ...;
            WebElement element = new WebDriverWait(SessionDataProvider.driver, 2)
                .until(ExpectedConditions.elementToBeClickable(locator));
            element.click();
        } catch (Exception e) {
            // handle exception
        }
    }
    

    请显示您的方法。是在*方法之前的
    @Before*
    方法中还是在构造函数中“设置功能并启动浏览器”?可能是在child中创建一个超类对象,然后通过它调用它。超类sl=新的超类();sl.driver.findelement(by.xpath(“xpath”).click();我不能在这里发布方法,因为它来自客户端计算机,但是,下面是它在超类中的外观没有方法,只有基类中的一个公共驱动变量,我有1个方法,它打开浏览器并验证页面标题。在Clicklink类中,我有两个方法首先创建objec