用Java扩展多个类,同时保留每个类的功能

时间:2017-03-15 20:12:27

标签: java selenium inheritance multiple-inheritance

我正在使用WebDriverSelenium),我希望将自定义方法添加到WebDriver,例如driver.performCustomAction()

因为我可以实例化FirefoxDriverChromeDriver的实例,所以我不能简单地延长FirefoxDriver因为我无法使用Chrome驱动程序的功能。

Tech我可以创建一个新类并将WebDriver的实例传递给构造函数(因此它可能是FF或Chrome)但是我将无法执行每个类的所有非自定义操作例如新对象上的findElements()getText()

换句话说,如果我的新类被称为WrappedWebDriver,并按照以下方式实例化它的新实例:

WebDriver FFDriver = new FirefoxDriver();
WrappedWebDriver WDriver = new WrappedWebDriver(FFDriver);

我将能够调用WDriver.performCustomAction(),但我将无法调用WDriver.findElement()FirefoxDriver类中定义的任何其他方法(或我可以执行的操作) FFDriver)。

如何保留同时适用于FirefoxDriverChromeDriver的新方法,而不保留两次,同时保留每个相应类的所有功能?

P.S:我知道Java不允许多重继承,还有其他方法吗?

2 个答案:

答案 0 :(得分:0)

我认为你可以创建Wrapper类,它将保存Webdriver的实例,你将包装你想要支持的webdriver方法。你可以这样做:

regex = /(.+)\\n([^,]+),\s(\w{2})\s(\d+)/

您可以通过在包装方法中添加一些功能来自定义Webdriver标准方法。通过使驱动程序公开,您可以为用户提供使用标准驱动程序方法或自定义方法选择beetween的选项。

对于名为Conductor的selenium,有一个很好且有用的Wrapper API。 https://github.com/conductor-framework/conductor。在那里,您可以找到更复杂的示例如何包装WebDriver。

答案 1 :(得分:0)

您可能需要扩展EventFiringWebDriver。这个类的行为本质上是复合的(它是通过引用现有的webdriver实例创建的),它最初被设计用于挖掘所有webdriver发起动作的前/后事件。但它可以很好地满足你的目的。

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.events.EventFiringWebDriver;

public class WrappedDriver extends EventFiringWebDriver {
    public WrappedDriver(WebDriver driver) {
        super(driver);
    }

    public void performCustomAction(){
        //your customization code 
    }
}

所以从本质上讲,你首先要构建一个装饰器来实现实际的RemoteWebDriver子类将实现的所有接口,然后让你的自定义类扩展装饰器。在这种情况下,装饰器类是EventFiringWebDriver