为什么我们将firefoxdriver实例分配给webdriver

我是Java或Selenium的新手。

我只是需要帮助来理解一个基本问题。

为什么我们将firefoxdriver实例分配给WebDriver? WebDriver驱动程序=新的FirefoxDriver()

我知道这是Java中的后期绑定,因为我们可以在以后的时间点将IEDriver或其他实例分配给WebDriver。

问题1:但这适用于课程,对吧?

问题2:WebDriver是一个接口,那么我们可以创建一个接口的对象实例吗?

WebDriver driver = new FirefoxDriver(); 

在上面的语句中, WebDriver是一个接口。 接口包含已定义但未实现的空方法。 只要不违反方法类型和签名,任何人都可以实现这些方法。 因此,接口也称为契约,因为您可以根据需要使用接口,但不能更改它的定义方式。 而且,由于它有空方法,你实际上不需要实例化它,所以你不能实例化它。

FirefoxDriver是专为Firefox浏览器编写的类。 它具有已实现的方法,可以实例化。 它可以在Web浏览器界面中定义的Firefox浏览器上执行所有function(或方法)。

所以在上面的声明中,我们实际上告诉FirefoxDriver类“嘿,你可以在Firefox浏览器上自动化你想要的各种方法,但你需要坚持在WebDriver定义的合同”。 因此,我们声明一个WebDriver类型的引用变量,然后使用它来实例化FirefoxDriver ,这意味着对象(驱动程序)的类型为WebDriver但指向FirefoxDriver所有数据和方法的内存分配(并且,如上所述, FirefoxDriver类已经在WebDriver实现了方法的实现版本。 好吧:)

通过使用这种技术,我们使测试人员可以轻松使用他或她喜欢的任何浏览器。 例如,要在IE驱动程序上自动化,就必须简单地编写一个类似的语句

 WebDriver driver = new IEDriver(); //where IEDriver is the class written for IE 

Webdriver是一个接口,而不是一个类。 我们创建一个Webdriver引用驱动程序并将其分配给类FirefoxDriver的对象。 要在Firefox上执行测试,请创建类Firefoxdriver的对象。 同样,要测试chrome,请使用Chromedriver类’对象并将其分配给Webdriver。 Webdriver是一个由FirefoxDriver类和ChromeDriver类(以及IE,Safari等其他浏览器的类)实现的接口。 只能将那些类的对象分配给实现该接口的接口引用(在本例中为Webdriver接口)

我知道这是Java中的后期绑定,

不。这是编译时绑定的一个例子。 但是,它也是WebDriver接口编程的一个例子。

问题1:但这适用于[sic]课程,对吗?

它(可以想象)可以是扩展WebDriver的接口。

问题2:WebDriver是一个接口,那么我们可以创建一个接口的对象实例吗?

是的,您可以创建实现接口的具体实例。 实际上,要使用任何接口,必须至少有一个具体的实现。

WebDriver是一个接口, FirefoxDriver是一个实现WebDriver合约的类。 请参阅Selenium doc 在此处输入链接描述

现在我们可以创建一个接口的引用变量但是我们不能实例化任何接口,因为它只是一个要实现的契约。但是我们可以将一个类的实例(在本例中为FirefoxDriver)分配给它的Parents(WebDriver)。

我们可以将子类分配给它的父类(它可以是一个或它扩展/实现的接口 )。

现在做WebDriver driver = new FirefoxDriver()背后的原因只是为客户端创建一个抽象 (Java程序),因为你可以根据浏览器使用Any Driver类。

它将使用Interface Concept。请参阅以下代码。

  FirefoxDriver f = new FirefoxDriver(); ChromeDriver c = new ChromeDriver(); 

要使用chrome加载页面,

c.get( “google.com”);

如果我想与firefox使用相同的调用,我需要注释上面的行,并需要写一个这样的新行

 //c.get("google.com"); f.get("google.com"); 

这将继续增加,最后是每个驱动程序实例的特定代码。 但是如果我将驱动程序实例分配给WebDriver接口变量,我可以编写一组适用于所有驱动程序的代码。

  WebDriver d; d = FireFoxDriver(); //just replace the above line with d = ChromeDriver() or InternetExplorer(); d.get("google.com"); d.getTitle(); d.close(); 

答案很简单,

WebDriver是一个具有共同行为的接口,我们进行了上传,因此可以跨类使用相同的行为。 例:

接口:考虑WebDriver具有Switch的行为

公共接口WebDriver

{

 void on(); void off(); int voltage=220;; 

}

Class1:将此视为ChromeDriver类

公共类ChromeDriver实现WebDriver {

 @Override public void on() { System.out.println("ChromeDriver On"); } @Override public void off() { System.out.println("ChromeDriver Off"); } 

第2类:将此类视为FireFoxDriver类

公共类FireFoxDriver实现WebDriver {

 @Override public void on() { System.out.println("FireFoxDriver On"); } @Override public void off() { System.out.println("FireFoxDriver Off"); } 

}

现在考虑一下Runner Class:

 //Here to change the implementation we just need to change the object //Whether you need to access Mozilla or Chrome 

公共类Runner {

  Webdriver driver = new ChromeDriver();//new FireFoxDriver(); driver.on(); driver.off();`` 

}

在创建浏览器的新实例时, new ChromeBrowser(); ChromeBrowser(ChromeDriver.exe)正在本地计算机上运行,​​并将随实例一起消亡。 因此浏览器会在每次创建实例时重新启动。 为避免多次重启浏览器,Webdriver负责通过引用Browser实例并控制浏览器不为每个实例创建重新启动。

 WebDriver driver = new ChromeDriver(); 

从文件;

一种WebDriver实现,用于控制在本地计算机上运行的Chrome浏览器。 提供此课程是为了方便测试Chrome浏览器。 每个实例与之通信的控制服务器将与实例一起生存和死亡。 为避免每个实例不必要地重新启动ChromeDriver服务器,请使用RemoteWebDriver和所需的ChromeDriverService,它们是单独管理的。