0

これを説明するのは難しいです。私はここ数年、何度も苦労してきました。何らかの方法でそれを行うためのパターンがあるに違いないと確信していますが、残念ながら私はそれを認識していません。

基本クラスと外部ライブラリのいくつかの子クラスを持つ (今日はセレンについてです) 基本クラス内にいくつかのヘルパー メソッドを導入したいと思います (既に存在するメソッドを使用)。このクラス。

具体例:

WebDriverSeleniumのクラスはfindElement、DOM 内の要素を検索する方法を提供します。最後に、特定のWebDriver例 (ChromeDriverまたはFirefoxDriver) を使用して、すべてのサブクラスを使用する必要がありますWebDriver

WebDriverすべてのサブクラス化ドライバーで使用できるいくつかの便利なメソッドで拡張したいと言いました。findElementTimeoutたとえば、多かれ少なかれそのようなものを含むメソッドを注入したいと思います:

manage().timeouts().implicitlyWait(milliseconds, TimeUnit.MILLISECONDS); WebElement element = findElement(selector); manage().timeouts().implicitlyWait(0 , TimeUnit.MILLISECONDS); return element;

実際、Selenium に関するものではなく、非常に一般的な使用例です。すでに与えられたメソッドを使用して、外国のソフトウェアの親クラスを変更します。そのような場合に使用される一般的な解決策を教えてもらえますか?

4

1 に答える 1

1

Java では、バイトコード インストルメンテーションに頼らずにクラスを動的に変更することはできません。この場合に使用される一般的なソフトウェア エンジニアリング ソリューションは、デコレータパターンです。

基本クラスを単一のコンストラクター引数として受け取るステートレス ラッパー クラスを作成できます。

 public class WebDriverDecorator {
      public final WebDriver webDriver;

      public WebDriverDecorator(WebDriver wd) {
          this.webDriver = wd;
      } 

      // add your conveniece methods here
 }

次に、サブクラス、または WebDriver のインスタンスがある他の場所で、それを WebDriverDecorator で装飾し、便利なメソッドを呼び出すことができます。

WebDriver wd = ....;
WebDriverDecorator wdd = new WebDriverDecorator(wd);
wdd.yourMethodCallGoesHere();
于 2013-09-20T10:15:39.250 に答える