で発生するエラーをキャプチャDOM
しSelenium
、おそらくページのエラーと同じフラグを立てる方法はありますか?
簡単な例を挙げると、存在しないHTMLコントロールでイベントをバインドしようとすると、ブラウザが次のようなエラーをスローします。
element abcd not found in the console.
ここで、同じエラーをセレンテストに失敗させたい場合、ブラウザに表示されるメッセージがエラーメッセージとして表示されます。
このようなことは可能ですか?
回答:
このスクリプトをページに配置してから、SeleniumでJSErrorをチェックインします。
<script type="text/javascript">
window.onerror=function(msg){
$("body").attr("JSError",msg);
}
</script>
document.body.setAttribute("JSError", msg)
、jQueryに依存する代わりに言うことができます
JavaScriptエラーをキャプチャするためにこれを行っています:
[TestCleanup]
public void TestCleanup()
{
var errorStrings = new List<string>
{
"SyntaxError",
"EvalError",
"ReferenceError",
"RangeError",
"TypeError",
"URIError"
};
var jsErrors = Driver.Manage().Logs.GetLog(LogType.Browser).Where(x => errorStrings.Any(e => x.Message.Contains(e)));
if (jsErrors.Any())
{
Assert.Fail("JavaScript error(s):" + Environment.NewLine + jsErrors.Aggregate("", (s, entry) => s + entry.Message + Environment.NewLine));
}
}
これがいつ変更されたかはわかりませんが、現時点ではPythonで機能します。このファイルは、JavaScriptエラーのある単純なページです。
In [11]: driver.get("file:///tmp/a.html")
In [12]: driver.get_log("browser")
Out[12]:
[{u'level': u'SEVERE',
u'message': u'ReferenceError: foo is not defined',
u'timestamp': 1450769357488,
u'type': u''},
{u'level': u'INFO',
u'message': u'The character encoding of the HTML document was not declared. The document will render with garbled text in some browser configurations if the document contains characters from outside the US-ASCII range. The character encoding of the page must be declared in the document or in the transfer protocol.',
u'timestamp': 1450769357498,
u'type': u''}]
Python-Seleniumバージョン2.48.0Linux Firefox 43.0
driver.log("browser").then(function(results){ console.log(results.value); }
これが私が使っているPythonウェブドライバーソリューションです:
def check_browser_errors(driver):
"""
Checks browser for errors, returns a list of errors
:param driver:
:return:
"""
try:
browserlogs = driver.get_log('browser')
except (ValueError, WebDriverException) as e:
# Some browsers does not support getting logs
LOGGER.debug("Could not get browser logs for driver %s due to exception: %s",
driver, e)
return []
errors = []
for entry in browserlogs:
if entry['level'] == 'SEVERE':
errors.append(entry)
return errors
JSErrorCollectorがその仕事をします。
構成が完了すると、次の問題が発生します。
List<JavaScriptError> jsErrorList = JavaScriptError.readErrors(driver);
非window.onerror
ベースのソリューション(私は試しませんでした):http://sejq.blogspot.com/2008/12/can-selenium-detect-if-page-has.html
jhanifenの答えを繰り返したいと思います。これは、jQueryに依存しないjavascriptソリューションです。ページの下部に非表示のHTMLリストを作成し、エラーを継続します。
(function () {
var ul = null;
function createErrorList() {
ul = document.createElement('ul');
ul.setAttribute('id', 'js_error_list');
ul.style.display = 'none';
document.body.appendChild(ul);
}
window.onerror = function(msg){
if (ul === null)
createErrorList();
var li = document.createElement("li");
li.appendChild(document.createTextNode(msg));
ul.appendChild(li);
};
})();
「window.onerror」を使用した解決策は私には機能しませんでした。
そこで、user-extensions.jsを変更することで私を助けた別の解決策を指摘したいと思います:
SeleniumはページにJavaScriptエラーがあるかどうかを検出できますか?
主な利点:ページソースを変更する必要がありませんチェックを行うためにを。
そして、user-extensions.jsの使用方法は次のとおりです
。Selenium-IDEでのUser-Extensionsの使用
注:このソリューションはFirefoxでのみ機能します
ここに、jhanifenの応答に触発された私の解決策があります。
// common.js - js file common to the entire app
globalError = []
window.onerror = function (msg, url, line, col, error) {
globalError.push({msg:msg, url:url, line:line})
};
# tests.py
def tearDown(driver):
# assert on js error
ret = driver.selenium.execute_script("return globalError ")
driver.assertFalse(ret, "errors %r " % ret)
# ret will be a dict looking like
# {'line': 50, 'url': 'http://localhost:8081/static/js/common.js', 'msg': 'Uncaught ReferenceError: s is not defined'}
Javaを使用している場合は、テストメソッドのアノテーションを使用してChromedriverセッションで受信したJSエラーを簡単に収集できる、私が委託したこのライブラリを試してみてください。これは、拡張アノテーションを使用するJUnit5、およびアノテーションを解析するリスナーを使用するTestNGで機能します。注釈にはブール値が含まれており、テストの実行後に検出されたエラーをアサートするかログに記録するかを決定できます。
JUnit5の例:
@Test
@JSErrorsCollectorJUnit
void referenceErrorTest(TestInfo testInfo) throws InterruptedException {
// Create a new instance of ChromeDriver.
driver = new ChromeDriver();
// Set your test name to point its ChromeDriver session in HashMap.
JSErrorsDriverHolder.setDriverForTest(testInfo.getDisplayName(), driver);
// Navigate to URL.
driver.get("http://testjs.site88.net");
// The click on the button in the test site should cause JS reference error.
driver.findElement(By.name("testClickButton")).click();
waitBeforeClosingBrowser();
}
私はTestCase.tearDown()
PythonSeleniumテストで以下を使用して、JavaScriptエラーの場合にテストを失敗させます。
def tearDown(self):
browser_logs = driver.get_log("browser")
errors = [logentry['message'] for logentry in browser_logs if logentry['level'] == 'SEVERE']
if errors:
self.fail(f'The following JavaScript errors occurred: {"; ".join(errors)}')
これは、@ kleptogと@ d3mingの回答に触発されています。