[初学者] 与仅将驱动程序对象传递给方法相比,使用单一实例驱动程序类有哪些优势? 什么是常见做法?
从技术上讲,您描述的两种方法都是单例 - 请记住,单例只是通过将类的实例化限制为一个对象来定义的。
只要你只初始化WebDriver
一次,无论你是使用继承的WebDriver
类实例,还是只是在方法调用中将其作为参数传递,都没有真正的区别。
现在,您在问题描述中描述的内容与在继承(而不是作为参数传递(的基类中使用WebDriver
类变量的替代方法之间的区别是一个不同的问题。您选择采取的方法取决于您使用Selenium/自动化的上下文。
如果要维护具有多个页面对象、多个测试文件等的测试套件,那么类变量WebDriver
是一个很好的方法 - 这是以线程安全的方式高效使用WebDriver
对象的好方法。
但是,如果您只是根据需要运行一个长 Selenium 脚本,则可以将WebDriver
传递到您所做的每个方法调用中。如果您最终编写了许多必须执行此操作的脚本,则维护起来可能会变得更加困难,这就是前面提到的类变量方法发挥作用的地方。
此存储库显示了类变量方法的一个很好的例子,您不必担心将WebDriver
传递到您所做的每个方法调用中。
除了在每次测试前后运行的setUp()
和tearDown()
方法之外,base_test_fixture
还实现了WebDriver
类变量 - 这些方法处理初始化和销毁WebDriver
对象。
我喜欢这种方法,因为您可以将WebDriver
对象传递到 PageObject 类中,并且 PageObject 实例可以使用WebDriver
来执行方法。此方法消除了在所有方法中必须将WebDriver
用作参数的问题。
对于冗长的解释,我们很抱歉 -- 很难用几句话来分解测试架构,所以我尽量提供尽可能多的信息。
你错了。驱动程序实例不必是单一实例。您可以创建多个这样的实例。
public class Foo {
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
WebDriver driver1 = new ChromeDriver();
WebDriver driver2 = new ChromeDriver();
}
}
但每个实例将创建一个单独的 Webdriver 会话、单独的浏览器和单独的浏览器配置文件。所以在某些合理的情况下,这是必要的,但实际上是不重要的。