【发布时间】:2019-11-24 16:52:19
【问题描述】:
[初学者] 与仅将驱动程序对象传递给方法相比,使用单例驱动程序类有什么优势? 什么是常见的做法?
【问题讨论】:
标签: java selenium selenium-chromedriver
[初学者] 与仅将驱动程序对象传递给方法相比,使用单例驱动程序类有什么优势? 什么是常见的做法?
【问题讨论】:
标签: java selenium selenium-chromedriver
从技术上讲,您描述的两种方法都是单例的——记住,singleton is just defined by restricting the instantiation of a class to one object。
只要您只初始化WebDriver 一次,无论您是使用WebDriver 的继承类实例,还是只是在方法中将其作为参数传递,这并没有什么区别来电。
现在,您在问题描述中描述的内容与在继承(而不是作为参数传递)的基类中使用 WebDriver 类变量的替代方法之间的区别是另一个问题。您选择采用的方法取决于您使用 Selenium / 自动化的上下文。
如果您正在维护一个包含多个页面对象、多个测试文件等的测试套件,那么WebDriver 类变量是一个好方法——这是一种有效地使用WebDriver 对象的好方法。线程安全的方式。
但是,如果您只是运行一个较长的 Selenium 脚本,则可以根据需要将WebDriver 传递到您进行的每个方法调用中。如果您最终编写了 许多 个必须执行此操作的脚本,则可能会变得更难维护,这就是前面提到的类变量方法发挥作用的地方。
This repository 展示了类变量方法的一个很好的示例,您不必担心将WebDriver 传递到您进行的每个方法调用中。
base_test_fixture 实现了一个WebDriver 类变量,除了在每次测试之前和之后运行的setUp() 和tearDown() 方法——这些方法处理初始化和销毁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 会话、单独的浏览器和单独的浏览器配置文件。所以在某些合理的情况下,这是必要的,但真的很不寻常。
【讨论】: