Приведение объекта к интерфейсу и доступ к методам интерфейса, реализованным в другом месте.

Мы используем следующий код, чтобы делать скриншоты в селене.

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() реализован в отдельном классе RemoteWebDriver, который реализует TakesScreenshot.

Здесь мы приводим объект драйвера к другому интерфейсу TakesScreenshot и используем его метод getScreenshotAs(), который реализован в совершенно другом классе.

Итак, если мы хотим использовать методы интерфейса, которые были реализованы в некоторых классах, можем ли мы использовать их, приведя наш объект (который был создан из класса, реализующего другой интерфейс) к этому интерфейсу?

Кроме того, если мы создадим драйвер, как

FirefoxDriver driver = new FirefoxDriver()

Мы не можем привести интерфейс к драйверу здесь. Мы должны использовать его как TakesScreenshot ts = drvier, а затем мы можем использовать метод getScreenshotAs(). Здесь тоже не уверены, что именно происходит?

Может кто-нибудь объяснить, пожалуйста?

Спасибо.

2 ответа

В вашем примере вы кастуете из WebDriver интерфейс к TakesScreenshot интерфейс. Вы всегда можете привести из одного интерфейса в другой, потому что компилятор Java не может определить, содержит ли ссылка, определенная одним интерфейсом, объект, который реализует другие интерфейсы. Эта проверка откладывается до времени выполнения, где вы получите ClassCastException если не получится.

FirefoxDriver не может напрямую реализовать TakesScreenshot но это расширяется RemoteWebDriver который делает. Из-за этого FirefoxDriver ЭТО TakesScreenshot согласно классу Javadocs. Вы можете написать следующее:

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

TakesScreenshot

TakesScreenshot - это публичный интерфейс, который предоставляет метод getScreenshotAs() захватить скриншот и сохранить его в указанном месте и реализует следующие классы:

  • FirefoxDriver
  • ChromeDriver
  • InternetExplorerDriver
  • EdgeDriver
  • OperaDriver
  • SafariDriver
  • 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");
}
Другие вопросы по тегам