有沒有辦法捕獲DOM
中發生的錯誤Selenium
,並且可能會將該錯誤標記爲頁面中的錯誤?在Selenium中捕獲JavaScript錯誤
舉一個簡單的例子,讓我們說我想要綁定一個不存在的HTML控件的事件,我的瀏覽器拋出一個錯誤說:
element abcd not found in the console.
現在,如果我想要的相同的錯誤來使我的硒測試失敗,並且瀏覽器上顯示的消息顯示爲錯誤消息。
是否有可能做這樣的事情?
有沒有辦法捕獲DOM
中發生的錯誤Selenium
,並且可能會將該錯誤標記爲頁面中的錯誤?在Selenium中捕獲JavaScript錯誤
舉一個簡單的例子,讓我們說我想要綁定一個不存在的HTML控件的事件,我的瀏覽器拋出一個錯誤說:
element abcd not found in the console.
現在,如果我想要的相同的錯誤來使我的硒測試失敗,並且瀏覽器上顯示的消息顯示爲錯誤消息。
是否有可能做這樣的事情?
這是關於測試js錯誤的信息。
http://www.silverwareconsulting.com/index.cfm/2010/6/7/Checking-for-JavaScript-Errors-with-Selenium
把你的網頁上運行此腳本,然後檢查中硒的JSError:
<script type="text/javascript">
window.onerror=function(msg){
$("body").attr("JSError",msg);
}
</script>
您嘗試在頁面中包含windows.onerror事件或在IE選項中啓用顯示錯誤對話框。如果你選擇在Se1中稍後會掛起。 PS:這裏已經討論過了。做一個搜索。
非window.onerror
爲基礎的解決方案(我沒有嘗試):http://sejq.blogspot.com/2008/12/can-selenium-detect-if-page-has.html
解決方案與「window.onerror」沒有爲我工作。
所以我想指出有改變用戶extensions.js這讓我另一種解決方案:
Can Selenium detect if the page has JavaScript errors?
主要優點:你不必改變頁面的源代碼做檢查。
這裏是如何使用用戶extensions.js:
Using User-Extensions With Selenium-IDE
注意:此方法僅適用於火狐
JSErrorCollector做這項工作。
一旦配置完成,這是的問題:
List<JavaScriptError> jsErrorList = JavaScriptError.readErrors(driver);
僅供參考:此項目目前僅支持Firefox – Aligned 2015-01-06 22:43:44
不知道什麼時候該改變了,但現在這對我的作品在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的硒版本2.48.0 的Linux的Firefox 43。0
這也適用於webdriver.io。 (功能(結果){ console.log(results.value); }''' – 2017-01-24 23:26:23
我這樣做是爲了捕捉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));
}
}
真的喜歡這個解決方案 – 2016-10-21 18:32:03
使用最新版本的Selenium驅動程序3.6 .0和Firefox 56.0,「GetLog」方法拋出一個「對象引用未設置爲對象的實例」,不知道爲什麼......這在舊版本的WebDriver/Firefox – 2017-10-20 15:08:57
這裏我的解決方案鼓舞人心的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'}
我想,反覆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);
};
})();
這裏的蟒蛇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
這可以很容易地擴展到也搭上情況下JQuery的未加載:加$(「身體」)ATTR(」。 JQLoaded「,」是「)在onerror調用之外。然後,在Selenium存在JSError的情況下,或者沒有JQLoaded,則表示出現Javascript錯誤。 – Nils 2012-05-23 07:17:58
或者你可以說'document.body.setAttribute(「JSError」,msg)'而不是依賴於jQuery – Kos 2014-04-28 08:49:46
它是否必須永久添加到HTML頁面,或者當運行測試時動態地添加?我不確定我會說服開發人員在每個頁面上添加該片段。感謝您分享我的細節。 – Michal 2016-03-11 12:13:26