为什么我们需要在调用 executeScript 方法之前将 WebDriver 实例类型转换为 JavascriptExecutor?

Why do we need to typecast the WebDriver instance to JavascriptExecutor before calling the executeScript method?

JavascriptExecutor 是一个接口,它为 executeScript 方法提供一些默认代码。

RemoteWebDriver实现了这个接口并重写了这样的方法:

@Override
    public Object executeScript(String script, Object... args) {...}

当我们创建 WebDriver 实例时,我们使用 FireFoxDriver 或 ChromeDriver 之类的实例。这些方法会继承父方法executeScript.

然而,每当我们想要调用 executeScript 时,我们绝不会像这样直接从驱动程序对象中调用此方法:

driver.executeScript(...)

相反,我们总是先将其类型转换为接口,然后再调用它。

这是一个示例代码:

WebDriver driver = new FirefoxDriver();
JavascriptExecutor executor =(JavascriptExecutor)driver;
executor.executeScript("window.location.href = 'https://google.com';");  

为什么我们需要将驱动程序类型转换为 JavascriptExecutor?为什么我们不能直接调用 driver.executeScript 呢?或者,我们可以将其强制转换为 RemoteWebDriver 吗?

我们正在类型转换,因为输出代码通常使用 webdriver 类型,它是一个接口,不包含 executeScript 方法。

当您将驱动程序作为“webdriver”类型传递时,类 假定它只有 WebDriver 接口的方法。您也可以将其转换为 Chromedriver 类型,但同样的代码不适用于 Geckodriver 或其他类型。

此答案归功于 pcalkins。

因此,您将它转换为接口 JavascriptExecutor 以保持代码的通用性,以便它可以与 Geckodriver / Chromedriver 等一起工作。或者,您也可以将它转换为 RemoteWebDriver,它仍然可以工作。但是当转换为 JavascriptExecutor 时它更具可读性。

这是一个完美解释这一点的架构图。此图片归功于 qacult.com。