我们使用下面的代码在selenium中拍摄截图。
WebDriver driver = new FirefoxDriver();
File src = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(src, new File("D:\\TestNGScreenshots\\screenshot.png"));以下是我的理解:
在这里,我们将驱动程序对象转换为另一个接口TakesScreenshot,并使用它的方法getScreenshotAs(),它是在一个完全不同的类中实现的。
因此,如果我们想要使用在某些类中实现的接口方法,我们可以通过将对象(从实现类创建到另一个接口)转换为该接口来使用它们吗?
另外,如果我们创建这样的驱动程序
FirefoxDriver driver = new FirefoxDriver()我们不能把接口传给这里的司机。我们必须像使用TakesScreenshot ts = drvier一样使用它,然后我们可以使用getScreenshotAs()方法。这里也不确定到底发生了什么?
有人能解释一下吗?
谢谢。
发布于 2018-09-21 13:23:36
在您的示例中,您将从WebDriver接口转换为TakesScreenshot接口。您总是可以从一个接口转换到另一个接口,因为Java编译器无法判断由一个接口定义的引用是否包含实现其他接口的对象。此检查被推迟到运行时,如果它失败,您将在运行时获得ClassCastException。
FirefoxDriver可能不直接实现TakesScreenshot,但它扩展了RemoteWebDriver。正因为如此,FirefoxDriver是-A TakesScreenshot (按类javadocs )。您可以写以下内容:
FirefoxDriver driver = new FirefoxDriver();
File src = driver.getScreenshotAs(OutputType.FILE);发布于 2018-09-21 14:35:46
TakesScreenshot
TakesScreenshot是一个公共接口,它提供了一个方法getScreenshotAs()来捕获屏幕快照并将其存储在指定的位置,并实现了以下类:
这意味着,可以捕获屏幕快照并存储它的驱动程序通过将驱动程序实例转换为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");
}https://stackoverflow.com/questions/52444524
复制相似问题