0

序文: この質問には多くの WebDriver 用語が含まれていますが、実際には Java プロキシに関する質問であり、私はまだ頭を抱えようとしています。WebDriver を理解していない場合は、スキップしてください。簡単な問題を投稿します。

WebElement現在、 andの周りにラッパーがあります。List<WebElement>つまりEnhancedWebElement、 andWebElementListです。これにはいくつかの理由があり、かなりの柔軟性が得られました。また、ページ オブジェクト パターンを使用し、作成した 2 つのラッパーとしてすべての要素を宣言します (これはうまく機能します)。

しかし、私は最近この質問をしました。要素内で要素を見つけ、全体をプロキシ内に保持したいと考えていました。答えはうまくいったので、それを一般的なものにしてEnhancedWebElementクラスに入れました。次のようになります。

public EnhancedWebElement findEnhancedWebElement(final By by){
        return (EnhancedWebElement) Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class<?>[] { WebElement.class }, new InvocationHandler() {
            // Lazy initialized instance of WebElement
            private EnhancedWebElement webElement;

            public Object invoke(Object proxy, Method method, Object[] args)
                    throws Throwable {
                if (webElement == null) {
                    webElement = new EnhancedWebElement(findElement(by), driver);
                }
                return method.invoke(webElement, args);
            }
        });
    }

しかし...これには1つの問題があります。要素内の要素内に要素が見つかった場合、最初のプロキシが失われます。findEnhancedWebElement()これは、次の機能を実行するために要素をインスタンス化するためです。

頭がおかしいと思うかもしれませんが、私の目標は一連の関数を用意して、次のようなことができるようにすることです。

EnhancedWebElement newElement = element.findElements(By.foo).getElementFoundBy(By.bar).findElement(By.foobar);

要素に対して何らかのアクションを実行するまで、ページでの選択はまだ実行されていません。newElement.click()

(本当に疑問に思っているのは、かなりの数の関数がEnhancedWebElementありWebElementList、それがインスタンス化されていないことに依存しているからです。単に click() を実行するだけなら、これはすべて必要ありません)

WebDriver を理解していないすべての人のために。私はオブジェクトXを持っています。別のオブジェクトXを返すことができる関数がありますが、それは何らかの処理を行った後でのみです。オブジェクト X には他の機能もあります。私がそうするならX someObject = new X().getX().getX().getX()、私は私がするまで処理をしたくありませんsomeObject.otherFunction()

4

1 に答える 1

0

私はそれを考え出した。新しい EnhancedWebElement ではなく、元の WebElement の周囲にプロキシを作成し、それをラップする EnhancedWebElement の新しいインスタンスを作成する必要がありました。そうすれば、findEnhancedWebElement() を使用しているときに、元の WebElement に触れることはありません。

于 2013-08-16T13:14:45.980 に答える