好吧,据我了解,这实际上不是特定于硒的问题,而是基本的 Java 问题。
您提供的表达式的含义:
((TakesScreenshot) driver).getScreenshotAs(OutputType.File)
如下:无论driver
变量的类型是什么,在这一行中我们确定它实现TakesScreenshot
了具有getScreenshotAs
方法的接口。所以我们将类型转换为对象TakesScreenshot
并调用getScreenshotAs
方法driver
。此方法的实现在真实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())
这导致行“你好,用户名”
编辑:
正如我在 JavaDoc to selenium 中看到的那样,WebDriver
接口不扩展 TakesScreenshot
接口。因此,如果driver
变量的类型是WebDriver
接口,则必须对其进行强制转换。-编译器WebDriver driver = new ChromeDriver()
只有类型参考。WebDriver
尽管真正的类是ChromeDriver
编译器并不知道它。因此,在这种情况下,为了调用getScreenshotAs
方法,您必须强制driver
转换为TakesScreenshot
(它是安全的,因为它的driver
实例ChromeDriver
同时实现了接口WebDriver
和TakesScreenshot
接口)。只有在那之后,您才能从接口调用getScreenshotAs
方法。TakesScreenshot
好吧,据我了解,这实际上不是特定于硒的问题,而是基本的 Java 问题。
您提供的表达式的含义:
((TakesScreenshot) driver).getScreenshotAs(OutputType.File)
如下:无论driver
变量的类型是什么,在这一行中我们确定它实现TakesScreenshot
了具有getScreenshotAs
方法的接口。所以我们将类型转换为对象TakesScreenshot
并调用getScreenshotAs
方法driver
。此方法的实现在真实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())
这导致行“你好,用户名”
编辑:
正如我在 JavaDoc to selenium 中看到的那样,WebDriver
接口不扩展 TakesScreenshot
接口。因此,如果driver
变量的类型是WebDriver
接口,则必须对其进行强制转换。-编译器WebDriver driver = new ChromeDriver()
只有类型参考。WebDriver
尽管真正的类是ChromeDriver
编译器并不知道它。因此,在这种情况下,为了调用getScreenshotAs
方法,您必须强制driver
转换为TakesScreenshot
(它是安全的,因为它的driver
实例ChromeDriver
同时实现了接口WebDriver
和TakesScreenshot
接口)。只有在那之后,您才能从接口调用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 casting