ハイブリッド アプリケーションをテストするために selendroid を使用します。ログを記録し、WebDriverWait を使用して特定の動作を待機する独自のロガーがあります。私の質問は、WebDriverWait が失敗して timeoutException がスローされる前にロガーを使用するにはどうすればよいですか?
2 に答える
まず、私はセレンドロイドについて何も知りません。
簡単な解決策は次のとおりです。
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
}
したがって、基本的にWebDriverWait
のuntil
メソッドが行っていることは、driver.findElement
untilを実行していることです。
次のいずれかが発生するまで、このインスタンスの入力値を特定の関数に繰り返し適用します。
- 関数は 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");
}
}