2010-11-15 136 views
58

有沒有辦法捕獲DOM中發生的錯誤Selenium,並且可能會將該錯誤標記爲頁面中的錯誤?在Selenium中捕獲JavaScript錯誤

舉一個簡單的例子,讓我們說我想要綁定一個不存在的HTML控件的事件,我的瀏覽器拋出一個錯誤說:

element abcd not found in the console.

現在,如果我想要的相同的錯誤來使我的硒測試失敗,並且瀏覽器上顯示的消息顯示爲錯誤消息。

是否有可能做這樣的事情?

回答

45

這是關於測試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> 
+3

這可以很容易地擴展到也搭上情況下JQuery的未加載:加$(「身體」)ATTR(」。 JQLoaded「,」是「)在onerror調用之外。然後,在Selenium存在JSError的情況下,或者沒有JQLoaded,則表示出現Javascript錯誤。 – Nils 2012-05-23 07:17:58

+32

或者你可以說'document.body.setAttribute(「JSError」,msg)'而不是依賴於jQuery – Kos 2014-04-28 08:49:46

+2

它是否必須永久添加到HTML頁面,或者當運行測試時動態地添加?我不確定我會說服開發人員在每個頁面上添加該片段。感謝您分享我的細節。 – Michal 2016-03-11 12:13:26

0

您嘗試在頁面中包含windows.onerror事件或在IE選項中啓用顯示錯誤對話框。如果你選擇在Se1中稍後會掛起。 PS:這裏已經討論過了。做一個搜索。

4

JSErrorCollector做這項工作。

一旦配置完成,這是的問題:

List<JavaScriptError> jsErrorList = JavaScriptError.readErrors(driver); 
+1

僅供參考:此項目目前僅支持Firefox – Aligned 2015-01-06 22:43:44

13

不知道什麼時候該改變了,但現在這對我的作品在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

+0

這也適用於webdriver.io。 (功能(結果){ console.log(results.value); }''' – 2017-01-24 23:26:23

31

我這樣做是爲了捕捉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)); 
    } 
} 
+2

真的喜歡這個解決方案 – 2016-10-21 18:32:03

+0

使用最新版本的Selenium驅動程序3.6 .0和Firefox 56.0,「GetLog」方法拋出一個「對象引用未設置爲對象的實例」,不知道爲什麼......這在舊版本的WebDriver/Firefox – 2017-10-20 15:08:57

1

這裏我的解決方案鼓舞人心的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'} 
2

我想,反覆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); 
    }; 
})(); 
4

這裏的蟒蛇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