复制/传递WebDriver实例是如何工作的,是否危险?

我一直在为一个团队开发Selenium WebDriver基础设施几个月,而我们从测试用例和页面对象访问驱动程序对象的方式让我感到困惑。

我们的测试用例创建一个新的WebDriver实例并打开浏览器。 这个新实例存储在测试用例类中。

然后,测试用例实例化一个页面对象。 以下是Selenium的页面对象模式,这些页面对象将WebDriver作为其构造函数的参数(尽管我注意到在我们的版本中它不是最终的)。 各种页面对象方法使用在页面对象的构造函数中设置的驱动程序来执行它们的操作。 如果页面对象方法导航到新的页面对象,那么WebDriver会传递给它。 就像Selenium的例子:

public class LoginPage {
    private final WebDriver driver;

    public LoginPage(WebDriver driver) {
        this.driver = driver;

        // Check that we're on the right page.
        if (!"Login".equals(driver.getTitle())) {
            // Alternatively, we could navigate to the login page, perhaps logging out first
            throw new IllegalStateException("This is not the login page");
        }
    }

    // Conceptually, the login page offers the user the service of being able to "log into"
    // the application using a user name and password. 
    public HomePage loginAs(String username, String password) {
        // This is the only place in the test code that "knows" how to enter these details
        driver.findElement(By.id("username")).sendKeys(username);
        driver.findElement(By.id("passwd")).sendKeys(password);
        driver.findElement(By.id("login")).submit();

        // Return a new page object representing the destination. Should the login page ever
        // go somewhere else (for example, a legal disclaimer) then changing the method signature
        // for this method will mean that all tests that rely on this behaviour won't compile.
        return new HomePage(driver);
    }
}

这看起来好像WebDriver实例是唯一且重要的,就像一个必须从页面对象传递给页面对象的火炬。 代码的风格使我认为我总是必须确保我使用的是上次操作中使用的驱动程序的相同实例。

但是,在页面上有多个页面对象的情况下,这种“火炬传递”变得复杂或不可能,并且页面对象方法不会返回您正在计划使用的页面对象。 当屏幕上有两个页面对象时,如何在同一WebDriver实例上进行操作,并且您需要在它们之间进行切换,而无需切换到新页面或创建新页面对象?

所有这些困惑都让我相信,火炬的传递实际上是不必要的,甚至可能发生(所有这些页面对象都存储对同一WebDriver实例的引用?),但是我不知道为什么该模式被建议Selenium给出的描述。

那么,我需要担心“传递火炬吗?” 或者,即使其他页面对象在过渡期间使用自己版本的相同WebDriver执行操作,任何页面对象在使用其WebDriver实例化后都能正常运行?

将WebDriver设置为单身人士,所有人都可以访问它,因为我们在任何时候都不会为每个JVM使用多个WebDriver,这会更简单/更好吗? 那么我们就不需要在构造函数中传递WebDriver了。 预先感谢您的任何意见。


最好将webdriver标记为整个框架的单例。 我一直在使用这种模式,它工作正常。
注意:处理并行执行时应该小心。

@CodeEnthusiastic例如拿一个类GeneralLibrary ,创建一个WebDriver

使用GeneralLibrary作为超类扩展页面对象模型中的类

链接地址: http://www.djcxy.com/p/65481.html

上一篇: How does copying/passing instances of a WebDriver work, and is it dangerous?

下一篇: Pad an array to a certain size