将对象强制转换为接口并访问在其他位置实现的接口方法



我们使用以下代码在硒中截图。

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((。这里也不确定到底发生了什么?

有人可以解释一下吗?

谢谢。

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

FirefoxDriver可能不会直接实现TakesScreenshot但它可以扩展RemoteWebDriver。正因为如此FirefoxDriverIS-ATakesScreenshot按照类 javadocs 进行。您可以编写以下内容:

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

TakesScreenshot

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

  • 火狐浏览器
  • ChromeDriver
  • Internet ExplorerDriver
  • 边缘驱动程序
  • 歌剧驱动程序
  • 野生动物园驱动程序
  • 事件射击网络驱动程序
  • 远程网络驱动程序
  • 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");
}

最新更新