1

ハイブリッド アプリケーションをテストするために selendroid を使用します。ログを記録し、WebDriverWait を使用して特定の動作を待機する独自のロガーがあります。私の質問は、WebDriverWait が失敗して timeoutException がスローされる前にロガーを使用するにはどうすればよいですか?

4

2 に答える 2

1

まず、私はセレンドロイドについて何も知りません。

簡単な解決策は次のとおりです。

public void waitForCondition(WebElement element){
    try{
        new WebDriverWait(driver, 60)
                .until(ExpectedConditions.visibilityOf(element)); // your condition
    } catch (TimeoutException e){
        // do log or whatever
    }
}

とにかく、通常はWebDriverEventListenerを実装してこれを行い、これをEventFiringWebDriverに登録してから、次のように呼び出します。

EventFiringWebDriver eventFiringWebDriver = new EventFiringWebDriver(new FirefoxDriver());
MyWebDriverEventListener listener = new MyWebDriverEventListener();
eventFiringWebDriver.register(listener);

のようなものはどこMyWebDriverEventListenerですか

class MyWebDriverEventListener implements WebDriverEventListener {
            // .. skipped
}

したがって、基本的にWebDriverWaituntilメソッドが行っていることは、driver.findElementuntilを実行していることです。

次のいずれかが発生するまで、このインスタンスの入力値を特定の関数に繰り返し適用します。

  • 関数は null も false も返しません。
  • 関数は無視されない例外をスローします。
  • タイムアウトの期限が切れ、
  • 現在のスレッドが中断されました

あなたができることは、ログインを実装することですWebDriverEventListener

public void afterFindBy(By by, WebElement element, WebDriver driver) {
    // Do logging 
}

これは、要素が見つかるたびに適用されます (待機だけでなく、通常の driver.findElement も)。とにかく、これは例外がスローされた場合をカバーしていません。onException次のような方法でログインする機会もあります

if (throwable instanceof TimeoutException){
    // log
}

私はそれをしませんが、それはあなたのコードです。

そうは言っても、私はそのような詳細なログレベルを気にしないので、通常はこれを行いません.必要なすべての待機を処理できる2つのヘルパーメソッドがあります:

public void waitUntil(WebElement element) {
    new WebDriverWait(driver, 60)
            .ignoring(NoSuchElementException.class)
            .ignoring(StaleElementReferenceException.class)
            .until(ExpectedConditions.visibilityOf(element));
}

public void waitUntil(List<WebElement> elements) {
    new WebDriverWait(driver, 60)
            .ignoring(NoSuchElementException.class)
            .ignoring(StaleElementReferenceException.class)
            .until(ExpectedConditions.visibilityOfAllElements(elements));
}

そこにロギングを追加するのは簡単です。


編集:次のソリューションが機能しています:

public class Demo {

    @Test
    public void testEventFire(){
        EventFiringWebDriver firingWebDriver = new EventFiringWebDriver(new FirefoxDriver());
        firingWebDriver.register(new MyListener());
        try {
            firingWebDriver.navigate().to(new URL("http://www.google.com"));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

    private static class MyListener extends AbstractWebDriverEventListener {
        @Override
        public void beforeNavigateTo(String url, WebDriver driver) {
            System.out.println("beforeNavigateTo");
        }

    }
于 2014-08-14T08:11:12.230 に答える