首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个"WebDriver驱动=新ChromeDriver()“,而不是这个"ChromeDriver driver=新ChromeDriver()”;

为什么这个"WebDriver驱动=新ChromeDriver()“,而不是这个"ChromeDriver driver=新ChromeDriver()”;
EN

Stack Exchange QA用户
提问于 2018-02-27 14:36:14
回答 5查看 32.9K关注 0票数 3

为什么我们总是这样做:

代码语言:javascript
复制
WebDriver driver = new ChromeDriver();

不是这样的:

代码语言:javascript
复制
ChromeDriver driver= new ChromeDriver();

有什么特别的原因,除了物体大小吗?

EN

回答 5

Stack Exchange QA用户

发布于 2018-02-27 17:53:51

我们通常是这样做的,因为通常我们希望能够在多个浏览器上运行测试。如果我们将驱动程序声明为特定的驱动程序类型,那么我们将只锚定到该驱动程序。如果你只需要在比如说Chrome上测试,这就不是问题了。但是,如果以后您希望您的测试也能够与IE、Opera、Firefox等一起工作呢?

这些是WebDriver接口的扩展类。

如果您的主测试和其他类将普通共享驱动程序定义为简单的WebDriver,而不是具体地绑定到ChromeDriver,那么可以通过使用不同的驱动程序扩展类初始化共享驱动程序对象来运行相同的测试,而不会更改测试代码本身。

票数 6
EN

Stack Exchange QA用户

发布于 2018-02-28 12:12:44

完全正确,比尔希尔曼给出了很好的解释,我已经被否决了。

除了消除这种疑虑,您还需要了解WebDriver和ChromeDriver/Firefoxdriver是什么。

代码语言:javascript
复制
ChromeDriver driver= new ChromeDriver();

通过使用上面的一行,这个脚本在chrome浏览器上工作得很好,但是如果我想在Firefox、IE或其他浏览器上运行相同的脚本,那么将来的事情就变得越来越复杂了。

我们如何修改相同的脚本,使其适用于多个浏览器(Selenium ),而不是为每个浏览器(如ChromeDriver、FirefoxDriver、IEDriver )提供脚本?为什么可以使用WebDriver而不是FirefoxDriver和ChromeDriver?

因为,与FirefoxDriver()ChromeDriver() (它们是类以便为它们创建对象)相比,WebDriver是一个接口。

接口只是一个由类实现的模板。它指定了类应该具有哪些字段和方法,但没有提供更多细节。

实现接口的类将提供方法实现。

因此,WebDriver是一个接口,FirefoxDriver和ChromeDriver类实现WebDriver接口。

记住,只是方法声明而没有方法实现。

FirefoxDriver()呢?

FirefoxDriver()/ChromeDriver()并没有真正实现WebDriver接口。

它是从实现RemoteDriver接口的WebDriver类继承的。

下面是RemoteDriver类的一些内容:

代码语言:javascript
复制
public class RemoteWebDriver implements WebDriver, JavascriptExecutor,FindsById, FindsByClassName, FindsByLinkText, FindsByName, FindsByCssSelector, FindsByTagName, FindsByXPath,
HasInputDevices, HasCapabilities, TakesScreenshot {

private static final Logger logger = Logger.getLogger(RemoteWebDriver.class.getName());
private Level level = Level.FINE;

private ErrorHandler errorHandler = new ErrorHandler();
private CommandExecutor executor;
private Capabilities capabilities;
private SessionId sessionId;
private FileDetector fileDetector = new UselessFileDetector();
private ExecuteMethod executeMethod;

public void get(String url) {
execute(DriverCommand.GET, ImmutableMap.of("url", url));
}

public String getTitle() {
Response response = execute(DriverCommand.GET_TITLE);
Object value = response.getValue();
return value == null ? "" : value.toString();
}

public String getCurrentUrl() {
Response response = execute(DriverCommand.GET_CURRENT_URL);
if (response == null || response.getValue() == null) {
throw new WebDriverException("Remote browser did not respond to getCurrentUrl");
} else {
return response.getValue().toString();
}
}

在RemoteDriver中有许多方法实现可用。

这就是为什么我们不能创建WebDriver对象的原因,因为WebDriver是一个接口,而不是一个类。

可以为接口创建一个对象并使用实现该接口的任何类实例化它。

像这样:WebDriver driver = new FirefoxDriver();

代码语言:javascript
复制
WebDriver driver = new ChromeDriver();

通过使用上面的代码,您的脚本现在是灵活的,并且可以使用调用特定浏览器所需的任何WebDriver对象。

在这里,WebDriver类型的引用变量允许我们将驱动程序对象分配给不同的浏览器特定驱动程序。因此,通过将驱动程序对象分配给任何所需的浏览器,可以进行多浏览器测试。

票数 4
EN

Stack Exchange QA用户

发布于 2018-03-19 12:53:33

这就是所谓的多态性。无论您使用的是第一行代码还是第二代码行,对象大小都将保持不变,因为在这两种情况下,ChromeDriver对象都被放置在内存中。

如果您要将该驱动程序传递给某些功能,可以使用唯一的WebDriver实现(而不知道更具体的实现,如ChromeDriver),或者您的代码支持多个浏览器,并对特定的浏览器类型进行一些复杂的初始化(从而使用一些特定的WebDriver实现),那么所讨论的模式是值得使用的。

您还应该记住,在WebDriver driver = new ChromeDriver();的情况下,除非使用显式类型转换,否则您将无法调用ChomeDriver的方法,因为WebDriver中没有描述特定于Chrome的方法。由于同样的原因,如果没有直接类型转换,您将无法将驱动程序传递到任何期望任何特定浏览器实现的方法。下面是简单WebDriverChromeDriver可用方法的示例。可以看出,ChromeDriver有比WebDriver定义的更多的可用方法。

然而,由于ChromeDriver实现了WebDriver接口,因此由于多态性的概念,它可以在Selenium框架中使用。

票数 0
EN
页面原文内容由Stack Exchange QA提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://sqa.stackexchange.com/questions/32305

复制
相关文章

相似问题

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