【问题标题】:why we assign firefoxdriver instance to webdriver为什么我们将 firefoxdriver 实例分配给 webdriver
【发布时间】:2014-09-10 03:52:05
【问题描述】:

我是 Java 或 Selenium 的新手。

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

为什么我们将 firefoxdriver 实例分配给 WebDriver? WebDriver driver=new FirefoxDriver()

我知道这是 Java 中的一种后期绑定,因为我们可以稍后将 IEDriver 或其他一些实例分配给 WebDriver。

问题1:但这适用于类,对吗?

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

【问题讨论】:

  • 你对接口了解多少?我建议您在开始使用 Selenium 之前学习该语言的核心概念,或者确实做任何“严肃”的事情。
  • 嗨,乔恩,所以我作为新手提到的原因。我知道接口就像一个类的蓝图,只包含成员声明,​​实现这个接口的类提供定义。我没有看到为接口创建的任何实例。所以问这个查询。
  • 基本上,我建议在这里忽略 Selenium - 只需阅读有关接口的教程。 docs.oracle.com/javase/tutorial/java/IandI/createinterface.html

标签: java selenium selenium-webdriver


【解决方案1】:
WebDriver driver = new FirefoxDriver();

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

FirefoxDriver 是专门为 Firefox 浏览器编写的类。它具有已实现的方法,并且可以实例化。它可以在 Firefox 浏览器上执行接口WebDriver 中定义的所有功能(或方法)。

所以在上面的声明中,我们实际上是在告诉FirefoxDriver 类“嘿,你可以在 Firefox 浏览器上自动化你想要的各种方法,但你需要遵守WebDriver 中定义的契约”。所以我们声明了一个WebDriver类型的引用变量,然后用它来实例化FirefoxDriver,也就是说对象(驱动)是WebDriver类型但是指向FirefoxDriver中所有数据和方法的内存分配(并且,如上所述,FirefoxDriver 类已经在WebDriver 中实现了方法版本)。所以一切都很好:)

通过使用这种技术,我们使测试人员可以轻松地使用他或她喜欢的任何浏览器。例如,要在 IE 驱动程序上实现自动化,只需编写类似

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

【讨论】:

    【解决方案2】:

    答案很简单,

    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 类:

    //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();``
    

    }

    【讨论】:

      【解决方案3】:

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

      没有。这是编译时绑定的示例。但是,是的,这也是对WebDriver 接口进行编程的示例。

      问题1:但这适用于[原文如此]类,对吧?

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          WebDriver driver = new ChromeDriver();
          

          From the documentation;

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

          【讨论】:

            【解决方案6】:

            WebDriver 是一个接口,FirefoxDriver 是一个实现这个WebDriver契约的类。请参阅 Selenium 文档enter link description here

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

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

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

            【讨论】:

              【解决方案7】:

              它将使用接口概念。参见下面的代码。

               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();
              

              【讨论】:

                【解决方案8】:
                package test.a1;
                
                import org.openqa.selenium.chrome.ChromeDriver;
                import org.openqa.selenium.firefox.FirefoxDriver;
                import org.openqa.selenium.ie.InternetExplorerDriver;
                
                public class testDriver {
                
                    public static void main(String[] args) 
                    {
                        // TODO Auto-generated method stub
                        String browser="FireFox";
                        if(browser=="Chrome")
                        {
                            System.setProperty("webdriver.chrome.driver",
                            "C:\\Users\\LL\\chromedriver_win32\\chromedriver.exe");
                
                            ChromeDriver driver = new ChromeDriver();
                            driver.get("https://www.gmail.com");
                        }
                        else if(browser=="IE")
                        {
                
                            System.setProperty("webdriver.ie.driver","Drivers\\IEDriverServer.exe");
                
                            InternetExplorerDriver driver = new InternetExplorerDriver();
                            driver.get("https://www.gmail.com");
                        }
                        else if(browser=="FireFox")
                        {
                
                            FirefoxDriver driver = new FirefoxDriver();
                            driver.get("https://www.gmail.com");
                        }
                    }
                }
                

                我们可以这样做..所以请告诉我们为什么..我们这样做Webdriver driver=new FirefoxDriver();

                【讨论】:

                  猜你喜欢
                  • 2021-08-03
                  • 1970-01-01
                  • 2012-07-25
                  • 1970-01-01
                  • 1970-01-01
                  • 2023-03-25
                  • 2021-01-20
                  • 1970-01-01
                  • 2020-07-02
                  相关资源
                  最近更新 更多