2010-11-15 12 views
58

¿Hay alguna forma de capturar los errores que se producen en DOM en Selenium y probablemente marcar igual que un error en la página?Error de captura de JavaScript en Selenium

para dar un breve ejemplo, digamos que estoy tratando de obligar a un evento en un control HTML no existente, el navegador genera un error diciendo:

element abcd not found in the console.

Ahora, si quiero que el mismo error para fallar mis pruebas de selenio y el mensaje que se muestra en el navegador se muestra como el mensaje de error.

¿Es posible hacer algo como esto?

Respuesta

45

Aquí hay información sobre la prueba de errores js.

http://www.silverwareconsulting.com/index.cfm/2010/6/7/Checking-for-JavaScript-Errors-with-Selenium

poner este script en su página y luego comprobar en selenio para la JSError:

<script type="text/javascript"> 
    window.onerror=function(msg){ 
     $("body").attr("JSError",msg); 
    } 
</script> 
+3

Esto se puede ampliar fácilmente para capturar también el caso en que jQuery no se cargó: añadir un $ ('cuerpo') attr (". JQLoaded "," Yes ") fuera de la llamada onerror. Luego, en presencia de Selenium de JSError, O ausencia de JQLoaded, se señala un error de Javascript. – Nils

+32

O podría simplemente decir 'document.body.setAttribute (" JSError ", msg)' en lugar de depender de jQuery – Kos

+2

¿Tiene que ser agregado a la página HTML para siempre, o dinámicamente cuando se ejecutan las pruebas? No estoy seguro de que convencería a los desarrolladores para que agreguen ese fragmento en cada página. Gracias por compartir los detalles para mí. – Michal

0

Intenta incluir el evento windows.onerror en su página o habilita el cuadro de diálogo mostrar error en las opciones de IE. Si elige, el último en Se1 se bloqueará. PD: Esto ha sido discutido aquí. Haz una búsqueda.

4

JSErrorCollector hace el trabajo.

Una vez configurado, es una cuestión de:

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

FYI: este proyecto actualmente solo es compatible con Firefox – Aligned

13

No sé cuando esto cambió, pero ahora esto funciona para mí en Python. El archivo es una página simple con un error de 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''}] 

versión de Python-Selenio 2.48.0 Linux Firefox 43.0

+0

Esto también funciona con webdriver.io. '' 'driver.log (" browser "). Then (function (results) { console.log (results.value); }' '' –

31

que estoy haciendo esto para capturar los errores de 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

Me gusta mucho esta solución –

+0

Usando la última versión del Selenium Driver 3.6 .0 y Firefox 56.0, el método "GetLog" arroja una "Referencia de objeto no configurada a una instancia de un objeto", no estoy seguro de por qué ... Esto funcionó en la versión anterior de WebDriver/Firefox –

1

Aquí mi solución inspiradora por la respuesta del 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

quisiera iterar sobre la respuesta de jhanifen. Aquí hay una solución de JavaScript que no depende de jQuery. Crea una lista HTML invisible en la parte inferior de la página, que contiene los errores.

(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

Aquí está la solución de pitón WebDriver que utilizo:

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 
Cuestiones relacionadas