在Selenium中捕获JavaScript错误
有没有一种方法来捕获在Selenium
DOM
中发生的错误,并可能标记为相同的页面中的错误?
举个简单的例子,假设我试图在一个不存在的HTML控件上绑定一个事件,我的浏览器会抛出一个错误:
element abcd not found in the console.
现在,如果我想要相同的错误,我的seleniumtesting失败,并显示在浏览器上的消息显示为错误消息。
有没有可能做这样的事情?
这里是关于testingjs错误的信息。
http://www.silverwareconsulting.com/index.cfm/2010/6/7/Checking-for-JavaScript-Errors-with-Selenium
把这个脚本放在你的页面上,然后在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中适用于我。 该文件是一个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
JSErrorCollector完成这项工作。
一旦configuration,这是一个问题:
List<JavaScriptError> jsErrorList = JavaScriptError.readErrors(driver);
非基于window.onerror
的解决scheme(我没有尝试): http : //sejq.blogspot.com/2008/12/can-selenium-detect-if-page-has.html
我想重复jhanifen的答案。 这里是一个JavaScript解决scheme,不依赖于jQuery。 它会在页面的底部创build一个不可见的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); }; })();
这里是我使用的python webdriver解决scheme:
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
“window.onerror”解决scheme不适合我。
所以我想指出另一个解决scheme,改变user-extensions.js帮助我:
Selenium能检测页面是否有JavaScript错误?
主要优点:您不必更改页面源进行检查。
这里是如何使用user-extensions.js:
在Selenium-IDE中使用用户扩展
注意:此解决scheme仅适用于Firefox
在这里,我的解决scheme激励詹妮芬的回应:
// 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'}
您可以尝试在页面中包含windows.onerror事件,或在IE选项中启用显示错误对话框。 如果你selectSe1后面会挂起。 PS:这里已经讨论过了。 做一个search。