Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.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单例驱动程序类是常见做法吗?_Java_Selenium_Selenium Chromedriver - Fatal编程技术网

Java 使用Selenium单例驱动程序类是常见做法吗?

Java 使用Selenium单例驱动程序类是常见做法吗?,java,selenium,selenium-chromedriver,Java,Selenium,Selenium Chromedriver,[初学者] 使用单例驱动程序类比只将驱动程序对象传递给方法有什么优势? 通常的做法是什么?你错了。驱动程序实例不必是单实例。您可以像这样创建多个实例 公共类Foo{ 公共静态void main(字符串[]args)引发异常{ System.setProperty(“webdriver.chrome.driver”,“/path/to/chromedriver”); WebDriver driver1=新的ChromeDriver(); WebDriver driver2=新的ChromeDriv

[初学者] 使用单例驱动程序类比只将驱动程序对象传递给方法有什么优势?
通常的做法是什么?

你错了。驱动程序实例不必是单实例。您可以像这样创建多个实例

公共类Foo{
公共静态void main(字符串[]args)引发异常{
System.setProperty(“webdriver.chrome.driver”,“/path/to/chromedriver”);
WebDriver driver1=新的ChromeDriver();
WebDriver driver2=新的ChromeDriver();
}
}

但每个实例将创建一个分离的Webdriver会话、分离的浏览器和分离的浏览器配置文件。因此,在某些合理的情况下,这是必要的,但实际上并不实用。

从技术上讲,您描述的两种方法都是单例的——记住

只要您只初始化一次
WebDriver
,无论您使用的是
WebDriver
的继承类实例,还是只是将其作为方法调用中的一个参数传递,都没有什么区别

现在,您在问题描述中描述的内容与在基类中使用
WebDriver
class变量的替代方法之间的区别是不同的,基类是继承的(而不是作为参数传递的)。您选择的方法取决于您使用Selenium/automation的环境

如果您正在维护一个包含多个页面对象、多个测试文件等的测试套件,那么
WebDriver
类变量是一个很好的方法——这是一种高效且以线程安全的方式使用
WebDriver
对象的好方法

但是,如果您只是根据需要运行一个长的Selenium脚本,那么可以将
WebDriver
传递到您进行的每个方法调用中。如果您最终编写了许多必须这样做的脚本,那么维护起来可能会有点困难,这就是前面提到的类变量方法发挥作用的地方

显示了类变量方法的一个很好的示例,您不必担心将
WebDriver
传递到每个方法调用中

base\u test\u fixture
除了在每次测试之前和之后运行的
setUp()
tearDown()
方法之外,还实现了一个
WebDriver
类变量——这些方法处理初始化和销毁
WebDriver
对象

我喜欢这种方法,因为您可以将
WebDriver
对象传递到PageObject类中,并且PageObject实例可以使用
WebDriver
执行方法。这种方法消除了在所有方法中都必须使用
WebDriver
作为参数的问题


对于冗长的解释,我深表歉意——很难用几句话来分解测试体系结构,因此我尝试提供尽可能多的信息。

我知道可以创建更多的实例。我忘了说,我用硒刮,所以我不认为有任何理由使超过1个实例。我问这个问题是因为一直将驱动程序对象传递给方法太烦人了。如果您围绕webdriver创建一个单例包装器/持有者类,您不必将实例传递给方法,只需获得唯一的一个webdriver对象即可。但是,您的解决方案将只适用于一个线程,一个实例。这取决于你为你的问题选择最好的解决方案。