2012-03-30 5 views
1

私のページ上の要素を見つけるために、@FindBy注釈を使用しています。このように:Webdriver PageFactory要素でWait.until()を使用します。

@FindBy(xpath = "//textarea") 
    public InputBox authorField; 

助けてください。私は注釈付きの要素を使ってwait(ExpectedConditions)を使用します。このように:

wait.until(visibilityOfElementLocated(authorField)); 

代わりに:事前のための

wait.until(visibilityOfElementLocated(By.xpath("//textarea"))); 

おかげ

答えて

1
ExpectedConditions.visibilityOf(authorField); 

期待される条件のソースコードを見てください。あなたが望むすべてのことをすることができる自分の条件を書くのはとても簡単です。

+0

ありがとう、私は自分の条件と作業を作成しました! – Arthur

3

問題はWebElementは通常WebElementを想定服用方法が既に発見された(そして、彼らは正しいということですPageFactory並べ!メソッドによってアクセスされる直前に、それが見つかるように)、つまりページ上に存在するようにします。 Byにメソッドを渡すとき、あなたは「私はそれが見つかるようにしたい、それがいつ現れるのか分からない」と言う。

あなたは、あなたが好きなだけの方法でそれを行う必要があります

// right after driver is instantiated 
driver.manage().timeouts().implicitlyWait(...); 

と接続詞に

wait.until(visibilityOf(authorField)); 

を使用することができます。

implicitlyWait()documentation言う:

は、それがすぐに存在しない場合、要素を検索するときに、ドライバが待機する時間を指定します。

単一の要素を検索する場合、ドライバは要素が見つかるまでページをポーリングするか、このタイムアウトが終了してNoSuchElementExceptionをスローする必要があります。複数の要素を検索する場合、ドライバは、少なくとも1つの要素が見つかるか、このタイムアウトが切れるまで、ページをポーリングする必要があります。

基本的に、ルックアップされるたびに要素が表示されるのを待ちます。明らかにあらゆる種類の非同期要求に適しています。

+0

Is暗黙的に非同期のページの読み込みに適していますか?私はAJAXでそれを使用する必要があるので? – Arthur

+0

回答(これは「はい」です)...答えに編集されました。 :) –

+0

ありがとう! Pavel Zorinがすべて正しかった後で、これを行うことさえ私は自分の条件を書く必要があります。 – Arthur

1

私は、この質問に既に回答していたことをもう少し前に尋ねられましたが、私は自分の期待する条件を書くための具体的な例を提供すると思いました。この予想条件クラスを作成することにより:

wait.until(new ProxyWebElementLocated(authorField)); 

をそして、それはあなたが本当に必要とするすべてです:

/** 
* Since the proxy won't try getting the actual web element until you 
* call a method on it, and since it is highly unlikely (if not impossible) 
* to get a web element that doesn't have a tag name, this simply will take 
* in a proxy web element and call the getTagName method on it. If it throws 
* a NoSuchElementException then return null (signaling that it hasn't been 
* found yet). Otherwise, return the proxy web element. 
*/ 
public class ProxyWebElementLocated implements ExpectedCondition<WebElement> { 

    private WebElement proxy; 

    public ProxyWebElementLocated(WebElement proxy) { 
     this.proxy = proxy; 
    } 

    @Override 
    public WebElement apply(WebDriver d) { 
     try { 
      proxy.getTagName(); 
     } catch (NoSuchElementException e) { 
      return null; 
     } 
     return proxy; 
    } 

} 

はその後、これはあなたがすることができます。

public final class MyExpectedConditions { 

    private MyExpectedConditions() {} 

    public static ExpectedCondition<WebElement> proxyWebElementLocated(WebElement proxy) { 
     return new ProxyWebElementLocated(proxy); 
    } 
} 

、あなたはこのような何かを行うことができるようになる:

wait.until(MyExpectedConditions.proxyWebElementLocated(authorField)); 

MyExpectedConditionsクラスがすることができますが、さらに一歩抽象化をしたい場合しかし、あなたはこのようなクラスを作成することができます1つの予想された条件に対して少し過剰ですが、複数の期待条件がある場合は、それを使うとより良いものになります。

ExpectedConditionsクラスのメソッドをラップするMyExpectedConditionsクラスにメソッドを追加すると、1つの場所からすべての予想条件を取得できます。 (私は、ラッパーメソッドを実行する代わりにExpectedConditionsを拡張することを提案しますが、拡張することは不可能なプライベートコンストラクターを持っていますので、ラッパーメソッドを1つの場所にすべてが欲しいもののための唯一のオプションとして残しています)。

関連する問題