code

Selenium에서 JavaScript 오류 캡처

codestyles 2020. 11. 1. 18:08
반응형

Selenium에서 JavaScript 오류 캡처


에서 발생하는 오류를 캡처 할 수있는 방법이 있습니까 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>

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에서 작동합니다. 이 파일은 자바 스크립트 오류가있는 간단한 페이지입니다.

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.0 Linux Firefox 43.0


내가 사용하는 python webdriver 솔루션은 다음과 같습니다.

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에 의존하지 않는 자바 스크립트 솔루션입니다. 페이지 하단에 보이지 않는 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 오류가 있는지 감지 할 수 있습니까?

주요 이점 : 확인을 위해 페이지 소스변경할 필요가 없습니다 .

And here is how to use user-extensions.js:
Using User-Extensions With Selenium-IDE

Note: This solution works only with Firefox


Here my solution inspiring by jhanifen's response:

// 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'}

If you're using java, you're welcome to try this library comitted by me which allows to easily collect JS errors received in Chromedriver session, using annotations on test methods. It works on on JUnit5 with extended annotation, and on TestNG with a listener parsing the annotation. The annotation contains boolean values which let you decide whether you want to assert or log the found errors after test execution.

JUnit5 example:

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

You try including windows.onerror event in your page or enable the show error dialog box in IE options. If you choose the later in Se1 will hang. PS: This has been discussed here. Do a search.


I use the following TestCase.tearDown() in my Python Selenium tests that makes the test fail in case of JavaScript errors:

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

This is inspired by @kleptog and @d3ming answers.

참고URL : https://stackoverflow.com/questions/4189312/capturing-javascript-error-in-selenium

반응형