WebDriverのJavascript以外のバージョンの場合、このような質問がいくつかあります(つまり、Seleniumのalert
に関する質問)。これらの質問についての回答では、推奨される一般的なパターンは次のとおりです。SeleniumのJavascript Webドライバでアラートを処理するにはどうすればよいですか?
try {
doSomethingWhichCausesAnAlert();
} catch(UnexpectedAlertOpenError e) {
doSomethingAboutException(e);
}
すべてが非同期であるため、しかし、私は、Javascriptのバージョンでそのパターンをコピーすることはできません。
try {
doSomethingWhichCausesAnAlert();
} catch(e) {
// this will never get reached
}
// 1ms or more later the alert appears, causing an exception
私は多分考えました.catch
:
el.sendKeys('invalid keystrokes that cause an alert')
.catch((e) => doSomethingWithException(e))
を使用することもできますが、どちらも機能しません。 catch
が解決した後でalert
例外が発生したようです。私はalert
例外をキャッチ(そして警告について何かを行う)ことができますどのように
TLDR
彼らはすべての私のコードのコンテキスト外に起こるように見えるとき?ところで
が、ここでは、アラート例外の例スタックトレースです:
UnexpectedAlertOpenError: unexpected alert open: {Alert text : Please enter a valid number ("not a number" is not a number).}
(Session info: chrome=53.0.2785.116)
(Driver info: chromedriver=2.23.409687 (c46e862757edc04c06b1bd88724d15a5807b84d1),platform=Linux 4.4.0-21-generic x86_64)
at WebDriverError (/home/me/project/node_modules/selenium-webdriver/lib/error.js:27:5)
at UnexpectedAlertOpenError (/home/me/project/node_modules/selenium-webdriver/lib/error.js:274:5)
at Object.checkLegacyResponse (/home/me/project/node_modules/selenium-webdriver/lib/error.js:512:13)
at parseHttpResponse (/home/me/project/node_modules/selenium-webdriver/lib/http.js:396:13)
at doSend.then.response (/home/me/project/node_modules/selenium-webdriver/lib/http.js:328:11)
at process._tickCallback (internal/process/next_tick.js:103:7)
From: Task: WebDriver.manage().deleteAllCookies()
at Driver.schedule (/home/me/project/node_modules/selenium-webdriver/lib/webdriver.js:414:17)
at Options.deleteAllCookies (/home/me/project/node_modules/selenium-webdriver/lib/webdriver.js:1178:25)
at World.<anonymous> (/home/me/project/test/cucumber/features/support/Hooks.js:23:37)
at _combinedTickCallback (internal/process/next_tick.js:67:7)
あなたが見ることができるように、でも関わっだ私のコードの一部のみがエラーになり、私のHooks.js
ファイルです
this.driver.manage().deleteAllCookies();
this.After
(テストは私がalert
について何かをするために手遅れに完了明らかAfter
)でCookieをクリーンアップするために:それが呼び出そうとしました。
P.S. After
がトリガーされる前にアラートが存在することを少なくとも確認するためのハッキーな方法が見つかりました。アラートが表示された後にthis.driver.manage().deleteAllCookies()
というステップを呼び出すと、例外が発生します。ただし、A)私はちょうどalert
を検出するためにクッキーを削除したくない、B)実際にはalert
を閉じる方法がまだありません。