SeleniumでJavaScriptエラーをキャプチャする


81

で発生するエラーをキャプチャDOMSelenium、おそらくページのエラーと同じフラグを立てる方法はありますか?

簡単な例を挙げると、存在しないHTMLコントロールでイベントをバインドしようとすると、ブラウザが次のようなエラーをスローします。

element abcd not found in the console.

ここで、同じエラーをセレンテストに失敗させたい場合、ブラウザに表示されるメッセージがエラーメッセージとして表示されます。

このようなことは可能ですか?


1
今は2018年ですが、よりクリーンなソリューションはありますか?
Fla 2018

回答:


52

このスクリプトをページに配置してから、SeleniumでJSErrorをチェックインします。

<script type="text/javascript">
    window.onerror=function(msg){
        $("body").attr("JSError",msg);
    }
</script>

3
これは簡単に拡張して、JQueryがロードされなかった場合もキャッチできます。onerror呼び出しの外に$( 'body')。attr( "JQLoaded"、 "Yes")を追加します。次に、SeleniumでJSErrorが存在する場合、またはJQLoadedが存在しない場合は、Javascriptエラーを通知します。
ニルス2012年

51
またはdocument.body.setAttribute("JSError", msg)、jQueryに依存する代わりに言うことができます
Kos

3
HTMLページに永久に追加する必要がありますか、それともテストの実行時に動的に追加する必要がありますか?すべてのページにそのスニペットを追加するように開発者を説得するかどうかはわかりません。詳細を共有していただきありがとうございます。
ミハル

3
リンク先のページはご利用いただけなくなりました。
Chris B. Behrens 2017年

54

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));
    }
}

3
このソリューションが本当に好き
Rob G

2
Selenium Driver3.6.0およびFirefox56.0の最新バージョンを使用すると、「GetLog」メソッドは「オブジェクト参照がオブジェクトのインスタンスに設定されていません」をスローします。理由はわかりません...これは古いバージョンのWebDriver /で機能しました。 Firefox
David Rogers

2
@DavidRogersこれが原因で、これはgeckodriverでは機能しなくなったと思います:github.com/mozilla/geckodriver/issues/284
ChristianHujer18年

19

これがいつ変更されたかはわかりませんが、現時点では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


これはwebdriver.ioでも機能します。 driver.log("browser").then(function(results){ console.log(results.value); }
タイラーホーキンス

これは現在、この問題のためにFirefoxでは機能しません:github.com/mozilla/geckodriver/issues/284
Christian Hujer 2018年

7

これが私が使っている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

6

JSErrorCollectorがその仕事をします。

構成が完了すると、次の問題が発生します。

List<JavaScriptError> jsErrorList = JavaScriptError.readErrors(driver);

2
参考

1
4年前の最後のコミットでは、Firefox36とFirebugについて話します...それ以来、多くのことが変わりました。
フロリダ州

これはこのための元のブログ投稿ですか?mguillem.wordpress.com/2011/10/11/…–
デビッド


3

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);
    };
})();

2

「window.onerror」を使用した解決策は私には機能しませんでした。

そこで、user-extensions.jsを変更することで私を助けた別の解決策を指摘したいと思います:
SeleniumはページにJavaScriptエラーがあるかどうかを検出できますか?

主な利点:ページソース変更する必要がありませんチェックを行うためにを。

そして、user-extensions.jsの使用方法は次のとおりです
。Selenium-IDEでのUser-Extensionsの使用

注:このソリューションはFirefoxでのみ機能します


2

ここに、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'}

1

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();
}

1

私は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の回答に触発されています。


0

ページにwindows.onerrorイベントを含めるか、IEオプションで[エラーの表示]ダイアログボックスを有効にしてみてください。後でSe1を選択すると、ハングします。PS:これはここで議論されました。検索を行います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.