首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在哪里定义了getScreenshotAs方法?

在哪里定义了getScreenshotAs方法?
EN

Stack Overflow用户
提问于 2017-10-08 09:27:55
回答 3查看 6K关注 0票数 0

我正在浏览selenium的屏幕代码。下面是它的代码:

代码语言:javascript
复制
File src = ((TakesScreenshot)driver).getScreenshotAs(OutputType.File);

在上面的行中,TakesScreenshot是一个接口,getScreenshotAs是一种方法。因此,我从这里了解到,我们正在将驱动程序类型化到TakesScreenshot接口,这意味着我们的驱动程序从现在起将像TakesScreenshot一样运行,之后将执行getScreenshotAs方法。

我在这里的问题是,接口只能有抽象的方法。因此,如何通过TakesScreenshot接口执行getScreenshotAs方法,因为它没有对该方法的任何定义。更准确地说,getScreenshotAs方法是在哪里定义的,上面的代码是如何工作的?

添加一些更多的细节:

TakesScreenshot ->一个接口

ChromeDriver类的驱动程序->实例(WebDriver driver =新ChromeDriver())

TakesScreenshot接口中的getScreenshotAs >方法。

上面的代码用于在selenium中截图网页。

EN

回答 3

Stack Overflow用户

发布于 2017-10-08 11:12:30

getScreenshotAs方法是在RemoteWebDriver类中实现的。您不能从driver实例中使用它,因为您使用了WebDriver接口(它没有扩展TakesScreenshot接口)来创建driver实例。

转换为(或首先使用) RemoteWebDriverChromeDriver也将允许您使用该方法。

代码语言:javascript
复制
File src = ((RemoteWebDriver)driver).getScreenshotAs(OutputType.File);
票数 2
EN

Stack Overflow用户

发布于 2017-10-09 04:53:07

首先,让我详细分析一下用于解释的代码:

代码语言:javascript
复制
File src = ((TakesScreenshot)driver).getScreenshotAs(OutputType.File);

进入这两行:

代码语言:javascript
复制
TakesScreenshot ts = (TakesScreenshot) driver;
File source = ts.getScreenshotAs(OutputType.FILE);

分析

根据文档,TakesScreenshot是org.openqa.selenium包中Selenium中的一个接口。public interface TakesScreenshot表示,可以捕获屏幕快照并以下面提到的方式存储它的驱动程序。public interface TakesScreenshot有一个名为WebElement的子接口。已知的实现类是:

  1. ChromeDriver
  2. FirefoxDriver
  3. InternetExplorerDriver
  4. EdgeDriver
  5. OperaDriver
  6. RemoteWebDriver
  7. RemoteWebElement`
  8. SafariDriver
  9. EventFiringWebDriver

在第一行中,我们将TakesScreenshot的实例初始化为ts,并将WebDriver实例即driver转换为该实例。

在第二行中,我们试图捕获屏幕快照并将其存储在指定的位置。对于WebDriver扩展TakesScreenshot,这将根据浏览器(casted)按照首选顺序返回以下对象做出最大努力:

  1. 整页
  2. 电流窗
  3. 当前帧的可见部分
  4. 包含浏览器的整个显示的屏幕快照。

getScreenshotAs()方法返回包含有关屏幕快照的存储信息的对象。在失败时,java.lang.UnsupportedOperationException,这意味着底层实现不支持截图捕获机制。

您可以找到详细信息文档这里

参考文献

您可以在如何用Selenium WebDriver截图中找到详细的讨论

票数 1
EN

Stack Overflow用户

发布于 2017-10-08 09:51:12

嗯,据我所知,这实际上不是一个特定于硒的问题,而是一个基本的Java问题。

你所提供的词语的含义:

代码语言:javascript
复制
((TakesScreenshot) driver).getScreenshotAs(OutputType.File)

如下所示:无论driver变量的类型是什么,在这一行中,我们都确定它实现了具有getScreenshotAs方法的TakesScreenshot接口。因此,我们将类型转换为TakesScreenshot,并在driver对象上调用getScreenshotAs方法。该方法的实现是在实际的driver类中,无论它是什么。

为了给出一个非常接近问题代码的例子(我使用这个方法来接受Object,所以我们确实需要将o转换到目标接口。不要在实际代码中这样做):

代码语言:javascript
复制
public void log(Object o) {
  ((Printable) o).print();
}

其中Printable是与print方法的一些接口

代码语言:javascript
复制
public interface Printable {
  void print();
}

所以如果我们有一些Printable的实现,比如

代码语言:javascript
复制
public class Greeting implements Printable {

  @Override
  public void print() {
    System.out.println("Hello, username");
  }

}

我们可以打电话

代码语言:javascript
复制
log(new Greeting())

这将导致行"Hello,username“

编辑:

正如我在JavaDoc中看到的那样,WebDriver接口并不扩展TakesScreenshot接口。因此,如果driver变量的类型是WebDriver接口,则必须对其进行强制转换。WebDriver driver = new ChromeDriver() -只有用于编译器的WebDriver类型的引用。尽管真实的类是ChromeDriver,但编译器并不知道它。因此,在本例中,为了调用getScreenshotAs方法,必须将driver转换为TakesScreenshot (因为driver是实现WebDriverTakesScreenshot接口的ChromeDriver的实例),这是安全的。只有在此之后,您才可以从getScreenshotAs接口调用TakesScreenshot方法。

嗯,据我所知,这实际上不是一个特定于硒的问题,而是一个基本的Java问题。

你所提供的词语的含义:

代码语言:javascript
复制
((TakesScreenshot) driver).getScreenshotAs(OutputType.File)

如下所示:无论driver变量的类型是什么,在这一行中,我们都确定它实现了具有getScreenshotAs方法的TakesScreenshot接口。因此,我们将类型转换为TakesScreenshot,并在driver对象上调用getScreenshotAs方法。该方法的实现是在实际的driver类中,无论它是什么。

为了给出一个非常接近问题代码的例子(我使用这个方法来接受Object,所以我们确实需要将o转换到目标接口。不要在实际代码中这样做):

代码语言:javascript
复制
public void log(Object o) {
  ((Printable) o).print();
}

其中Printable是与print方法的一些接口

代码语言:javascript
复制
public interface Printable {
  void print();
}

所以如果我们有一些Printable的实现,比如

代码语言:javascript
复制
public class Greeting implements Printable {

  @Override
  public void print() {
    System.out.println("Hello, username");
  }

}

我们可以打电话

代码语言:javascript
复制
log(new Greeting())

这将导致行"Hello,username“

编辑:

正如我在JavaDoc中看到的那样,WebDriver接口并不扩展TakesScreenshot接口。因此,如果driver变量的类型是WebDriver接口,则必须对其进行强制转换。WebDriver driver = new ChromeDriver() -只有用于编译器的WebDriver类型的引用。尽管真实的类是ChromeDriver,但编译器并不知道它。因此,在本例中,为了调用getScreenshotAs方法,必须将driver转换为TakesScreenshot (因为driver是实现WebDriverTakesScreenshot接口的ChromeDriver的实例),这是安全的。只有在此之后,您才可以从getScreenshotAs接口调用TakesScreenshot方法。

代码语言:javascript
复制
WebDriver driver = new ChromeDriver();
// driver.getScreenshotAs(OutputType.File); // compilation error as there is no method getScreenshotAs in WebDriver interface
((TakesScreenshot) driver).getScreenshotAs(OutputType.File); // ok after explicit casting
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46629557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档