序文: この質問には多くの 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()