Захват ошибки JavaScript в Selenium
Есть ли способ захвата ошибок, возникающих в DOM
в Selenium
, и, вероятно, флаг того же самого, что и ошибка на странице?
Чтобы дать краткий пример, скажем, я пытаюсь связать событие с несуществующим элементом управления HTML, мой браузер выдает сообщение об ошибке:
element abcd not found in the console.
Теперь, если я хочу, чтобы одна и та же ошибка завершилась неудачей, мои тесты селена и сообщение, которое отображается в браузере, отображаются как сообщение об ошибке.
Можно ли сделать что-то подобное?
Ответы
Ответ 1
Вот информация о тестировании ошибок js.
http://www.silverwareconsulting.com/index.cfm/2010/6/7/Checking-for-JavaScript-Errors-with-Selenium
Поместите этот script на свою страницу, а затем зайдите в Selenium для JSError:
<script type="text/javascript">
window.onerror=function(msg){
$("body").attr("JSError",msg);
}
</script>
Ответ 2
Я делаю это, чтобы зафиксировать ошибки 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
Не уверен, когда это изменилось, но сейчас это работает для меня в 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
Ответ 4
JSErrorCollector выполняет задание.
После настройки, это вопрос:
List<JavaScriptError> jsErrorList = JavaScriptError.readErrors(driver);
Ответ 5
Решение, отличное от window.onerror
(я не пытался): http://sejq.blogspot.com/2008/12/can-selenium-detect-if-page-has.html
Ответ 6
Я хотел бы повторить ответ на jhanifen. Вот решение 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);
};
})();
Ответ 7
Здесь решение 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
Ответ 8
Решение с "window.onerror" не сработало для меня.
Итак, я хотел бы указать на другое решение с изменением user-extensions.js, которое помогло мне:
Может ли Selenium определить, есть ли на странице ошибки JavaScript?
Главное преимущество: вам не нужно изменить источник страницы, чтобы выполнить проверку.
И вот как использовать user-extensions.js:
Использование пользовательских расширений с помощью Selenium-IDE
Примечание. Это решение работает только с Firefox
Ответ 9
Здесь мое решение, вдохновляющее ответ 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'}
Ответ 10
Вы пытаетесь включить событие windows.onerror на свою страницу или включить диалоговое окно show error в настройках IE. Если вы выберете более позднюю версию Se1, она зависает.
PS: Это обсуждалось здесь. Сделайте поиск.