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