12

WebElementとが存在するのを待つと便利WebDriverWaitですExpectedConditions

問題は、ID、名前、一意のクラスがないため、要素を見つける唯一の方法だったとしたらどうでしょうか?WebElement.findElment

WebDriverWaitWebDriverのコンストラクターは引数としてのみ受け入れ、 ではありませんWebElement

時間を設定したimplicitlyWaitので、 を使用するのは得策ではないようtry{} catch(NoSuchElementException e){}です。なぜなら、この要素をそれほど長く待ちたくないからです。

シナリオは次のとおりです。

多くのinputタグを含むフォームを持つ 1 つの Web ページがあります。各inputタグにはフォーマット要件があります。

フォーマット要件が満たされない場合、このタグの後に動的divタグが存在します。input

inputタグが非常に多いため、次のような一般的なメソッドを作成します。

public WebElement txtBox(String name) {
    return driver.findElement(By.name(name));
}

input各タグのデータ メンバーを作成する代わりに。

次にisValid、一部のユーザー入力inputが有効かどうかを確認するメソッドを作成します。で行う必要があるのは、次のようなコードを使用して、 の後にタグが存在isValidするかどうかを確認することだけです。divinputboxToCheck

public boolean isValid(WebElement inputboxToCheck) {
    WebElementWait wait = new WebElementWait(inputboxToCheck, 1);
    try {
        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("./following-sibling::div")));
        return false;
    } catch (TimeOutException e) {
        return true;
    }    
}

WebElementWaitと同じように機能する架空の (存在しない) クラスWebDriverWaitです。

4

4 に答える 4

9

これが役立つかどうかはわかりませんが、要素をどれだけ待つことができますか。

public WebElement findDynamicElement(By by, int timeOut) {
    WebDriverWait wait = new WebDriverWait(driver, timeOut);
    WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(by));
    return element;
}

findDynamicElement(By.xpath("//body") , 30);
于 2013-11-08T08:48:10.447 に答える
5

user2432405 のソリューションのより普遍的なバリアントは、WebElement ではなく SearchContext タイプを使用することです。

public class SearchContextWait  extends FluentWait<SearchContext>  {
    ...

これにより、SearchContext インターフェイスが WebDriver と WebElement の両方の先祖であるため、同様に WebDriver と WebElement の両方で待機を行うことができます。isValid メソッドも調整が必要です。

...
        WebElement icon = wait
                .until(new Function<SearchContext, WebElement>() {
                    public WebElement apply(SearchContext d) {
...

残念ながら、ExpectedConditions.xxxx() メソッドは内部で WebDriver インターフェイスを使用するため、便利な機能がすべて失われます。

于 2015-04-07T21:36:22.150 に答える