【发布时间】:2017-08-06 18:47:51
【问题描述】:
我正在使用WebDriver (Selenium),我想向WebDriver 添加自定义方法,例如driver.performCustomAction()。
因为我可以实例化FirefoxDriver 或ChromeDriver 的实例,所以我不能简单地扩展FirefoxDriver,因为我将无法使用Chrome 驱动程序的功能。
Tech 我可以创建一个新类并将 WebDriver 的实例传递给构造函数(因此它可以是 FF 或 Chrome)但是我将无法执行每个类的所有非自定义操作,例如findElements(), getText() 在新对象上。
换句话说,如果我的新类被称为 WrappedWebDriver 并且我实例化它的一个新实例,如下所示:
WebDriver FFDriver = new FirefoxDriver();
WrappedWebDriver WDriver = new WrappedWebDriver(FFDriver);
我将能够调用WDriver.performCustomAction(),但我将无法调用WDriver.findElement() 或FirefoxDriver 类中定义的任何其他方法(或我可以使用FFDriver 执行的操作)。
如何添加适用于FirefoxDriver 和ChromeDriver 的新方法,而无需编写两次,同时保留每个相应类的所有功能?
P.S:我知道 Java 不允许多重继承,还有其他方法吗?
【问题讨论】:
-
接口怎么样?
-
或者是一个同时包装了 FirefoxDriver 和 ChromeDriver 的包装类
-
你写一个新的类
WrappedWebDriver实现WebDriver接口,并在构造函数中使用WebDriver怎么样?您必须实现接口中定义的方法,但您只需调用您传入的方法的驱动程序。 -
有些人在他们的包装器中使用装饰器模式,基本上像
public WebElement findElement(By by){return this.driver.findElement(by)}这样复制你想要的方法如果你实现WebDriver接口它会迫使你装饰整个东西,但是让您针对该接口编写的代码仍然可以工作。如果这让您感到难过,您还可以通过wrappedWebDriver.getDriver().FindElement...公开访问driver -
或者您可以使用
C#并仅使用扩展方法 :) IMO 实现WebDriver接口并将所有调用转发给驱动程序是正确的方法,即使它感觉像代码过分了
标签: java selenium inheritance multiple-inheritance