Ошибка захвата JavaScript в Selenium - PullRequest
70 голосов
/ 16 ноября 2010

Есть ли способ зафиксировать ошибки, возникающие в DOM в Selenium и, возможно, пометить их как ошибку на странице?

Для краткого примера, скажем, я пытаюсьчтобы привязать событие к несуществующему элементу управления HTML, мой браузер выдает ошибку:

element abcd not found in the console.

Теперь, если я хочу, чтобы эта же ошибка не прошла мои тесты на селен и сообщението, что отображается в браузере, отображается как сообщение об ошибке.

Возможно ли сделать что-то подобное?

Ответы [ 12 ]

49 голосов
/ 02 декабря 2010

Поместите этот скрипт на свою страницу, а затем проверьте в Selenium JSError:

<script type="text/javascript">
    window.onerror=function(msg){
        $("body").attr("JSError",msg);
    }
</script>
48 голосов
/ 16 марта 2016

Я делаю это для захвата ошибок 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));
    }
}
17 голосов
/ 22 декабря 2015

Не уверен, когда это изменилось, но сейчас это работает для меня в 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.0 Linux Firefox 43.0

7 голосов
/ 14 декабря 2016

Вот решение для веб-драйвера Python, которое я использую:

6 голосов
/ 07 декабря 2013

JSErrorCollector выполняет работу.

После настройки это вопрос:

List<JavaScriptError> jsErrorList = JavaScriptError.readErrors(driver);
3 голосов
/ 25 сентября 2016

Я бы хотел повторить ответ Джанифена. Вот решение javascript, которое не зависит от 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);
    };
})();
3 голосов
/ 11 ноября 2011

Решение без window.onerror (я не пробовал): http://sejq.blogspot.com/2008/12/can-selenium-detect-if-page-has.html

2 голосов
/ 15 апреля 2016

Вот мое решение, вдохновленное ответом Джанифена:

// 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'}
2 голосов
/ 18 октября 2012

Решение с помощью "window.onerror" у меня не сработало.

Итак, я хотел бы указать на другое решение с изменением user-extensions.js, которое мне помогло:
Может ли Selenium определить, есть ли на странице ошибки JavaScript?1007 * Главное преимущество: вам не нужно изменять источник страницы , чтобы выполнить проверку.

А вот как использовать user-extensions.js:
Использование пользовательских расширений с Selenium-IDE

Примечание. Это решение работает только с Firefox

1 голос
/ 28 мая 2018

Если вы используете Java, вы можете попробовать эту библиотеку , которую я выбрал, которая позволяет легко собирать ошибки JS, полученные в сеансе Chromedriver, используя аннотации к тестовым методам.Он работает на 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();
}
...