Приведение объекта к интерфейсу и доступ к методам интерфейса, реализованным в другом месте. - PullRequest
0 голосов
/ 21 сентября 2018

Мы используем следующий код для создания снимков экрана в селене.

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 ]

0 голосов
/ 21 сентября 2018

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");
}
0 голосов
/ 21 сентября 2018

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

FirefoxDriver может напрямую не реализовывать TakesScreenshot, но расширяет RemoteWebDriver, что и происходит.Из-за этого FirefoxDriver IS-A TakesScreenshot согласно классу javadocs .Вы можете написать следующее:

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