我正在浏览selenium的屏幕代码。下面是它的代码:
File src = ((TakesScreenshot)driver).getScreenshotAs(OutputType.File);在上面的行中,TakesScreenshot是一个接口,getScreenshotAs是一种方法。因此,我从这里了解到,我们正在将驱动程序类型化到TakesScreenshot接口,这意味着我们的驱动程序从现在起将像TakesScreenshot一样运行,之后将执行getScreenshotAs方法。
我在这里的问题是,接口只能有抽象的方法。因此,如何通过TakesScreenshot接口执行getScreenshotAs方法,因为它没有对该方法的任何定义。更准确地说,getScreenshotAs方法是在哪里定义的,上面的代码是如何工作的?
添加一些更多的细节:
TakesScreenshot ->一个接口
ChromeDriver类的驱动程序->实例(WebDriver driver =新ChromeDriver())
TakesScreenshot接口中的getScreenshotAs >方法。
上面的代码用于在selenium中截图网页。
发布于 2017-10-08 11:12:30
getScreenshotAs方法是在RemoteWebDriver类中实现的。您不能从driver实例中使用它,因为您使用了WebDriver接口(它没有扩展TakesScreenshot接口)来创建driver实例。
转换为(或首先使用) RemoteWebDriver或ChromeDriver也将允许您使用该方法。
File src = ((RemoteWebDriver)driver).getScreenshotAs(OutputType.File);发布于 2017-10-09 04:53:07
首先,让我详细分析一下用于解释的代码:
File src = ((TakesScreenshot)driver).getScreenshotAs(OutputType.File);进入这两行:
TakesScreenshot ts = (TakesScreenshot) driver;
File source = ts.getScreenshotAs(OutputType.FILE);分析
根据文档,TakesScreenshot是org.openqa.selenium包中Selenium中的一个接口。public interface TakesScreenshot表示,可以捕获屏幕快照并以下面提到的方式存储它的驱动程序。public interface TakesScreenshot有一个名为WebElement的子接口。已知的实现类是:
在第一行中,我们将TakesScreenshot的实例初始化为ts,并将WebDriver实例即driver转换为该实例。
在第二行中,我们试图捕获屏幕快照并将其存储在指定的位置。对于WebDriver扩展TakesScreenshot,这将根据浏览器(casted)按照首选顺序返回以下对象做出最大努力:
getScreenshotAs()方法返回包含有关屏幕快照的存储信息的对象。在失败时,java.lang.UnsupportedOperationException,这意味着底层实现不支持截图捕获机制。
您可以找到详细信息文档这里。
参考文献
您可以在如何用Selenium WebDriver截图中找到详细的讨论
发布于 2017-10-08 09:51:12
嗯,据我所知,这实际上不是一个特定于硒的问题,而是一个基本的Java问题。
你所提供的词语的含义:
((TakesScreenshot) driver).getScreenshotAs(OutputType.File)如下所示:无论driver变量的类型是什么,在这一行中,我们都确定它实现了具有getScreenshotAs方法的TakesScreenshot接口。因此,我们将类型转换为TakesScreenshot,并在driver对象上调用getScreenshotAs方法。该方法的实现是在实际的driver类中,无论它是什么。
为了给出一个非常接近问题代码的例子(我使用这个方法来接受Object,所以我们确实需要将o转换到目标接口。不要在实际代码中这样做):
public void log(Object o) {
((Printable) o).print();
}其中Printable是与print方法的一些接口
public interface Printable {
void print();
}所以如果我们有一些Printable的实现,比如
public class Greeting implements Printable {
@Override
public void print() {
System.out.println("Hello, username");
}
}我们可以打电话
log(new Greeting())这将导致行"Hello,username“
编辑:
正如我在JavaDoc中看到的那样,WebDriver接口并不扩展TakesScreenshot接口。因此,如果driver变量的类型是WebDriver接口,则必须对其进行强制转换。WebDriver driver = new ChromeDriver() -只有用于编译器的WebDriver类型的引用。尽管真实的类是ChromeDriver,但编译器并不知道它。因此,在本例中,为了调用getScreenshotAs方法,必须将driver转换为TakesScreenshot (因为driver是实现WebDriver和TakesScreenshot接口的ChromeDriver的实例),这是安全的。只有在此之后,您才可以从getScreenshotAs接口调用TakesScreenshot方法。
嗯,据我所知,这实际上不是一个特定于硒的问题,而是一个基本的Java问题。
你所提供的词语的含义:
((TakesScreenshot) driver).getScreenshotAs(OutputType.File)如下所示:无论driver变量的类型是什么,在这一行中,我们都确定它实现了具有getScreenshotAs方法的TakesScreenshot接口。因此,我们将类型转换为TakesScreenshot,并在driver对象上调用getScreenshotAs方法。该方法的实现是在实际的driver类中,无论它是什么。
为了给出一个非常接近问题代码的例子(我使用这个方法来接受Object,所以我们确实需要将o转换到目标接口。不要在实际代码中这样做):
public void log(Object o) {
((Printable) o).print();
}其中Printable是与print方法的一些接口
public interface Printable {
void print();
}所以如果我们有一些Printable的实现,比如
public class Greeting implements Printable {
@Override
public void print() {
System.out.println("Hello, username");
}
}我们可以打电话
log(new Greeting())这将导致行"Hello,username“
编辑:
正如我在JavaDoc中看到的那样,WebDriver接口并不扩展TakesScreenshot接口。因此,如果driver变量的类型是WebDriver接口,则必须对其进行强制转换。WebDriver driver = new ChromeDriver() -只有用于编译器的WebDriver类型的引用。尽管真实的类是ChromeDriver,但编译器并不知道它。因此,在本例中,为了调用getScreenshotAs方法,必须将driver转换为TakesScreenshot (因为driver是实现WebDriver和TakesScreenshot接口的ChromeDriver的实例),这是安全的。只有在此之后,您才可以从getScreenshotAs接口调用TakesScreenshot方法。
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 castinghttps://stackoverflow.com/questions/46629557
复制相似问题