【问题标题】:Casting Object to an interface and accessing the interface methods implemented elsewhere将 Object 转换为接口并访问在其他地方实现的接口方法
【发布时间】:2018-09-21 13:10:08
【问题描述】:

我们使用以下代码在 selenium 中截屏。

WebDriver driver = new FirefoxDriver();
File src = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(src, new File("D:\\TestNGScreenshots\\screenshot.png"));

这是我的理解:

  • TakesScreenshot 是一个提供方法的接口 getScreenshotAs() 获取屏幕截图。
  • 但是 WebDriver 没有扩展这个接口。
  • FirexfoxDriver 类也没有实现这个接口
  • getScreenshotAs() 方法在单独的类中实现 实现 TakesScreenshot 的 RemoteWebDriver。

在这里,我们将驱动程序对象转换为另一个接口 TakesScreenshot,我们正在使用它的方法 getScreenshotAs(),该方法在完全不同的类中实现。

那么,如果我们想使用在某些类中实现的接口方法,我们可以通过将我们的对象(从实现另一个接口的类创建)转换为该接口来使用它们吗?

另外,如果我们像这样创建驱动程序

FirefoxDriver driver = new FirefoxDriver()

我们无法在此处将接口转换为驱动程序。我们必须像使用它一样 TakesScreenshot ts = drvier 然后我们可以使用getScreenshotAs()方法。这里也不确定到底发生了什么?

谁能解释一下?

谢谢。

【问题讨论】:

标签: java selenium selenium-webdriver webdriver takesscreenshot


【解决方案1】:

在您的示例中,您正在从WebDriver 接口转换为TakesScreenshot 接口。您总是可以从一个接口转换到另一个接口,因为 Java 编译器无法判断一个接口定义的引用是否不包含实现其他接口的对象。此检查推迟到运行时,如果失败,您将在其中获得 ClassCastException

FirefoxDriver 可能不会直接实现TakesScreenshot,但它扩展了RemoteWebDriver。正因为如此FirefoxDriver IS-A TakesScreenshot 根据the class javadocs。您可以编写以下内容:

FirefoxDriver driver = new FirefoxDriver();
File src = driver.getScreenshotAs(OutputType.FILE);

【讨论】:

    【解决方案2】:

    截图

    TakesScreenshot是公共接口,提供了一个方法getScreenshotAs()来截取屏幕截图并将其存储在指定位置,并实现了以下类:

    • Firefox 驱动程序
    • Chrome 驱动程序
    • InternetExplorer 驱动程序
    • EdgeDriver
    • Opera 驱动程序
    • Safari 驱动程序
    • EventFiringWebDriver
    • RemoteWebDriver
    • RemoteWebElement

    这意味着可以捕获屏幕截图并存储它的驱动程序是通过将驱动程序实例转换为TakesScreenshot类型实例来实现的。

    举个例子:

    public static void takeScreenShot() throws IOException{
        String path = "./ScreenShots/";
        File scrFile = ((TakesScreenshot)drive).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(scrFile, new File(path + "Subbu" + ".jpg"));
        System.out.println("Screenshot Taken");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      • 2019-07-26
      • 2019-05-08
      • 2020-01-06
      • 1970-01-01
      相关资源
      最近更新 更多