openqa - selenium mac
Captura de error de JavaScript en el selenio (11)
¿Hay alguna manera de capturar los errores que se producen en el DOM
en el Selenium
y probablemente marcar lo mismo que un error en la página?
Para dar un breve ejemplo, digamos que estoy intentando vincular un evento en un control HTML no existente, mi navegador arroja un error que dice:
element abcd not found in the console.
Ahora, si quiero que el mismo error falle en mis pruebas de selenio, el mensaje que se muestra en el navegador se muestra como el mensaje de error.
¿Es posible hacer algo como esto?
Aquí está la solución de python webdriver que uso:
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
Aquí mi solución inspirada por la respuesta de 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''}
Coloque este script en su página y luego marque Selenium para el JSError:
<script type="text/javascript">
window.onerror=function(msg){
$("body").attr("JSError",msg);
}
</script>
Estoy haciendo esto para capturar 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));
}
}
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.
La solución con "window.onerror" no funcionó para mí.
Así que me gustaría señalar otra solución con la modificación de user-extensions.js que me ayudó a:
¿Se puede detectar Selenium si la página tiene errores de JavaScript?
Ventaja principal: no es necesario cambiar el origen de la página para realizar el control.
Y aquí está cómo usar user-extensions.js:
Uso de extensiones de usuario con Selenium-IDE
Nota: Esta solución solo funciona con Firefox
Me gustaría repetir 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);
};
})();
No estoy seguro de cuándo esto cambió, pero en este momento 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''''}]
Python-Selenium versión 2.48.0 Linux Firefox 43.0
Si está utilizando Java, le invitamos a probar esta biblioteca realizada por mí que permite recopilar fácilmente los errores JS recibidos en la sesión Chromedriver, utilizando anotaciones en los métodos de prueba. Funciona en JUnit5 con anotación extendida, y en TestNG con un oyente que analiza la anotación. La anotación contiene valores booleanos que le permiten decidir si desea afirmar o registrar los errores encontrados después de la ejecución de la prueba.
Ejemplo JUnit5:
@Test
@JSErrorsCollectorJUnit
void referenceErrorTest(TestInfo testInfo) throws InterruptedException {
// Create a new instance of ChromeDriver.
driver = new ChromeDriver();
// Set your test name to point its ChromeDriver session in HashMap.
JSErrorsDriverHolder.setDriverForTest(testInfo.getDisplayName(), driver);
// Navigate to URL.
driver.get("http://testjs.site88.net");
// The click on the button in the test site should cause JS reference error.
driver.findElement(By.name("testClickButton")).click();
waitBeforeClosingBrowser();
}
Solución no window.onerror
based (no lo intenté): http://sejq.blogspot.com/2008/12/can-selenium-detect-if-page-has.html
JSErrorCollector hace el trabajo.
Una vez configurado, es una cuestión de:
List<JavaScriptError> jsErrorList = JavaScriptError.readErrors(driver);