Problema
El monitor Sintético Simple, Scripted o Scripted API (sin ping) de New Relic informó un error, pero la aplicación parece haberse cargado correctamente. Para errores de ping y de monitor simple, consulte errores de monitor sin secuencia de comandos.
Soluciones
A continuación se muestran algunos de los mensajes de error monitor no relacionados con ping más comunes.
Errores browser simples o programados
Problema
El script Sintético intenta .click()
un elemento (Elemento A) en el punto (X,Y), pero otro elemento (Elemento B) oscurece el elemento de destino.
Solución
Establezca un tiempo de espera personalizado, dando tiempo para que se cumpla una condición específica. En este caso, hasta que la animación de carga ya no sea visible:
.then(function () { return $browser.wait( $driver.until.elementIsNotVisible($browser.findElement($driver.By.id("LOADING"))), 10000 );});
Alternativamente, puede establecer un retraso de suspensión personalizado usando $browser.sleep(sleeptime_ms)
, deteniendo la ejecución del script durante un período de tiempo específico. Como se trata de una cantidad fija de tiempo de espera, que no tiene en cuenta el aumento de la latencia de la red ni la degradación del rendimiento del sitio, recomendamos utilizar la función .wait()
en su lugar.
Sugerencia
Esto no corregirá .click()
problemas causados por encabezados o pies de página fijos. En estos casos, es posible que tengas que desplazarte manualmente para ver el objetivo.
Causa
Esto sucede si el elemento de destino, en el momento de la función .click()
, está oculto por:
- Una superposición de carga, modal o ventana emergente
- Una animación que revela el elemento de destino.
- Un encabezado o pie de página fijo
Problema
El elemento objetivo no es visible para Selenium Webdriver.
Solución
Verifique que el elemento de destino no tenga aplicadas las propiedades CSS de display: none
o visibility: hidden
.
Causa
Selenium Webdriver no encontrará ningún elemento que tenga una propiedad CSS de display: none
o visibility: hidden
, ya que el script solo buscará elementos que sean realmente visibles para un usuario.
Problema
Selenium Webdriver no pudo encontrar este elemento en el DOM visible.
Solución
Para resolver este problema:
Confirme que el localizador de elementos que se utiliza para el elemento de destino sea preciso. Evite el uso
By.XPath
siempre que sea posible, ya que está rígidamente vinculado a la estructura DOM de la página y puede quedar obsoleto fácilmente cuando hay actualizaciones en la página.Si el elemento está en un iframe, use
$browser.switchTo().frame(<index or element reference>
.Sugerencia
Consulte la documentación de Selenium para obtener más información sobre las funciones
switchTo()
yTargetLocator()
.Causa
Las razones comunes para este error incluyen:
El elemento de destino no puede ubicarse mediante funciones como:
$browser.findElement(locator: $driver.Locator)
o$browser.waitForAndFindElement(locator: $driver.Locator [, timeout: number]
Esto puede deberse a un problema de sincronización. Por ejemplo, Webdriver intenta localizar el elemento antes de que se haya cargado la página.
El elemento está en un iframe, que es un contexto de documento separado.
Problema
La ejecución del monitor con script alcanzó el umbral de tiempo de espera no configurable de 180 segundos y se finalizó la ejecución.
Solución
Si se trata de un error frecuente, considere dividir las tareas programadas en un monitor con secuencias de comandos independiente.
Si parece que una tarea específica está provocando que el trabajo espere una cantidad de tiempo inaceptable, considere cambiar el método mediante el cual realiza esa tarea. Por ejemplo, cambiar $browser.findElement(locator: $driver.Locator)
a $browser.waitForAndFindElement(locator: $driver.Locator [, timeout: number)
asignaría a la tarea su propio tiempo de espera configurable.
Si tiene varios pasos en los que se llama a la función $browser.waitForAndFindElement(locator, timeout)
, asegúrese de que la suma de los tiempos de espera proporcionados para estos pasos no supere los 180 segundos. Si le resulta difícil lograr esto, entonces es una señal de que el monitor probablemente debería dividirse en un script de monitor separado.
Causa
Todos los monitores con script de Sintético tienen un tiempo de espera global máximo no configurable de 180 para ejecutar un script.
Si un script no se completa después de 180 segundos, el trabajo finaliza. Si esto sucede constantemente, podría ser una señal de que un script está tardando demasiado en completarse o que el trabajo está esperando un período prolongado mientras intenta realizar una tarea programada.
Problema
La prueba API o el script monitor de browser con parecen estar ejecutándose pero devuelve este error.
Solución
Asegúrese de que se llame a $http.get()
o $browser.get()
de forma adecuada y que generen tráfico.
Para el monitor de API con secuencia de comandos, si está utilizando una opción de solicitud para activar un agente HTTP no instrumentado bajo el capó, especifique uno de nuestros agentes HTTP instrumentados usando cualquiera de las opciones de solicitud de agente a continuación:
$globalAgents.http
$globalAgents.https
Ejemplo:
var options = {uri: "https://www.newrelic.com",agent: $globalAgents.https,agentOptions: {rejectUnauthorized: false,},strictSSL: false,};function callback(err, res, body) {//...}$http.get(options, callback);Causa
Esto ocurre en las ejecuciones monitor con script cuando el cliente HTTP ($http en el monitor de API con script) o browser Chrome ($browser en el monitor de browser con script) no se utiliza para generar tráfico HTTP.
En algunos casos, ciertas opciones de solicitud en el monitor API pueden obligar a utilizar un nuevo agente HTTP, uno que no esté instrumentado por monitoreo sintético, para recopilar tráfico HTTP.
Problema
El objeto $network
utilizado para configurar los servidores proxy del monitor no está disponible para el tiempo de ejecución de ese monitor.
Solución
Si su monitor se creó antes de la versión 0.4.0 del tiempo de ejecución, cree un nuevo monitor para aprovechar el último tiempo de ejecución. La versión actual del tiempo de ejecución de su monitor se muestra en la parte superior de la configuración del monitor.
Para obtener más información, consulte Entornos de ejecución de versión de monitor con secuencias de comandos.
Causa
Este error se produce al intentar utilizar $network
en un monitor con un tiempo de ejecución igual o inferior a 0.2.2. El tráfico del monitor proxy se introdujo en la versión 0.4.0 del tiempo de ejecución del monitor, haciendo que este método se evalúe como indefinido en tiempos de ejecución de monitor anteriores.
Problema
Este error indica que el trabajo alcanzó el umbral de tiempo de espera del contenedor docker y que el script finalizó.
Solución
Si se trata de un error frecuente, considere dividir las tareas programadas en un monitor con secuencias de comandos independiente.
Si parece que una tarea específica está provocando que el trabajo espere una cantidad de tiempo inaceptable, considere cambiar el método mediante el cual realiza esa tarea. Por ejemplo, cambiar $browser.findElement(locator: $driver.Locator)
a $browser.waitForAndFindElement(locator: $driver.Locator [, timeout: number)
asignaría a la tarea su propio tiempo de espera configurable.
Si tiene varios pasos en los que se llama a la función $browser.waitForAndFindElement(locator, timeout)
, asegúrese de que la suma de los tiempos de espera proporcionados para estos pasos no supere los 180 segundos. Si le resulta difícil lograr esto, entonces es una señal de que el monitor probablemente debería dividirse en un script de monitor separado.
Causa
Todos los monitores con script de Sintético tienen un tiempo de espera global máximo no configurable de 180 para ejecutar un script.
Si un script no se completa después de 180 segundos, el trabajo finaliza. Si esto sucede constantemente, podría ser una señal de que un script está tardando demasiado en completarse o que el trabajo está esperando un período prolongado mientras intenta realizar una tarea programada.
Problema
La página de destino se cargó, pero hubo un cambio en un elemento entre la ejecución de un localizador de elementos y una acción que se ejecuta en el elemento.
Solución
Configure su browser con secuencias de comandos para que espere hasta que la página esté establecida antes de realizar una acción findElement()
. Esto se puede lograr estableciendo un tiempo de espera personalizado, usando la función $browser.wait(fn, timeout)
antes de la llamada a findElement, para esperar una condición que indique un estado de página establecido. Esto hará que sea menos probable que la manipulación de DOM provoque que una referencia quede obsoleta.
Alternativamente, puede establecer un retraso de suspensión personalizado usando $browser.sleep(sleeptime_ms)
, deteniendo la ejecución del script durante un período de tiempo específico. Como se trata de una cantidad fija de tiempo de espera, que no tiene en cuenta el aumento de la latencia de la red ni la degradación del rendimiento del sitio, recomendamos utilizar la función .wait()
en su lugar.
Causa
Este error suele ocurrir cuando la script intenta .click()
un elemento después de usar la función findElement()
o waitForAndFindElement()
.
Si el DOM ha cambiado entre el momento en que se generó el localizador de elementos y la acción se ejecutó contra el elemento, este error se producirá porque el elemento real ha cambiado.
Por ejemplo: la función findElement()
se utiliza para generar una referencia de elemento mientras el script de la página manipula activamente el DOM. Luego se cambia el DOM, lo que hace que la referencia generada previamente quede obsoleta. La referencia ahora desactualizada se utiliza en un intento de realizar una acción .click()
, lo que provoca una falla en este monitor.
Sugerencia
Para obtener más información, consulte la documentación de Selenium sobre excepciones de referencia de elementos obsoletos.
Problema
La función waitForAndFindElement(<locator>, <timeout>)
no pudo localizar un elemento dentro del tiempo de espera proporcionado.
Solución
Confirme que el localizador de elementos que se utiliza para el elemento de destino sea preciso. Evite usar By.XPath()
siempre que sea posible, ya que está rígidamente ligado a la estructura DOM de la página y puede quedar obsoleto fácilmente cuando hay actualizaciones en la página.
Causa
El elemento de destino no existía en la página cuando se llamó a la función waitForAndFindElement(<locator>, <timeout>)
. Esto puede deberse a que la página de destino no se encuentra en el estado esperado.
Las razones comunes para este error incluyen:
- Existe un problema legítimo con el sitio de destino.
- El localizador de elementos que se utiliza es incorrecto.
- El sitio objetivo ha cambiado, requiriendo la revisión del script Sintético.
- La acción anterior en el script no se completó correctamente, lo que provocó que la página estuviera en un estado inesperado cuando se inició la llamada posterior a waitForAndFindElement().
Problema
La página de destino se cargó correctamente, pero devolvió el error:
TimeoutError: Se agotó el tiempo de carga de la página (no se pueden finalizar todas las solicitudes de red a tiempo)
Solución
Si las fallas comenzaron repentinamente, investigue cualquier solicitud que pueda estar bloqueando o retrasando el evento de carga de la página. Si no está seguro de qué solicitud está causando el error, utilice la vista de línea de tiempo para identificar cualquier solicitud HTTP de larga duración.
Si la página frecuentemente no puede cargarse completamente dentro del tiempo de espera actual, establezca un tiempo de espera de carga de página personalizado usando la función $browser.manage().timeouts().pageLoadTimeout(ms: number)
.
Causa
La página de destino se cargó correctamente, pero el evento de carga de la página no se activó dentro del tiempo de espera de carga de la página establecido en la función .pageLoadTimeout()
.
Hay varias razones por las que podrías ver este mensaje de error, entre ellas:
- Una solicitud de recurso bloqueada en la página retrasó la carga de la página.
- Una solicitud de recurso se procesó más lentamente de lo normal debido a un problema de red subyacente.
- Un recurso dependiente en la página bloqueó el evento de carga del iframe.
Problema
La función isElementPresent()
, utilizada por el monitor Sintético con un tiempo de ejecución >= 0.5.0, ha quedado obsoleta en Selenium 3.
Solución
Para continuar usando esta función después de la depreciación, deberá crear una versión personalizada de esta función, como por ejemplo:
return $browser.findElements(ele).then(function (found) { return found.length > 0;});
Uso de ejemplo, que devolvería verdadero:
$browser .get("https://www.newrelic.com") .then(function () { return isElementPresent($driver.By.id("nav_signup")); }) .then(function (found) { return console.log(found); });
Causa
Esto puede ocurrir al intentar utilizar un script de monitor de browser con script de un monitor más antiguo (<= 0.4.1 runtime) con un monitor más nuevo (>= 0.5.0). tiempo de ejecución.
Errores monitor de API con secuencias de comandos
Problema
La prueba API o el script monitor de browser con parecen estar ejecutándose pero devuelve este error.
Solución
Asegúrese de que se llame a $http.get()
o $browser.get()
de forma adecuada y que generen tráfico.
Para el monitor de API con secuencia de comandos, si está utilizando una opción de solicitud para activar un agente HTTP no instrumentado bajo el capó, especifique uno de nuestros agentes HTTP instrumentados usando cualquiera de las opciones de solicitud de agente a continuación:
$globalAgents.http
$globalAgents.https
Ejemplo:
var options = {uri: "https://www.newrelic.com",agent: $globalAgents.https,agentOptions: {rejectUnauthorized: false,},strictSSL: false,};function callback(err, res, body) {// ...}$http.get(options, callback);Causa
Esto ocurre en las ejecuciones monitor con script cuando el cliente HTTP ($http en el monitor de API con script) o browser Chrome ($browser en el monitor de browser con script) no se utiliza para generar tráfico HTTP.
En algunos casos, ciertas opciones de solicitud en el monitor API pueden obligar a utilizar un nuevo agente HTTP, uno que no esté instrumentado por monitoreo sintético, para recopilar tráfico HTTP.
Problema
El objeto $network
utilizado para configurar los servidores proxy del monitor no está disponible para el tiempo de ejecución de ese monitor.
Solución
Si su monitor se creó antes de la versión 0.4.0 del tiempo de ejecución, cree un nuevo monitor para aprovechar el último tiempo de ejecución. La versión actual del tiempo de ejecución de su monitorse muestra en la parte superior de la página Configuración del monitor.
Para obtener más información, consulte Entornos de ejecución de versión de monitor con secuencias de comandos.
Causa
Este error se produce al intentar utilizar $network
en un monitor con un tiempo de ejecución igual o inferior a 0.2.2. El tráfico del monitor proxy se introdujo en la versión 0.4.0 del tiempo de ejecución del monitor, haciendo que este método se evalúe como indefinido en tiempos de ejecución de monitor anteriores.
Problema
JSON.parse()
Se pasó una cadena que comienza con el carácter < y probablemente sea HTML, en lugar de JSON.
Solución
Asegúrese de que el objetivo extremo devuelva el cuerpo de respuesta esperado. Puede hacerlo registrando el cuerpo de la respuesta en la devolución de llamada, antes de intentar analizar.
Ejemplo:
$http.get("http://www.newrelic.com", function (error, response, body) { if (error) { throw new Error(error); }
console.log(body); // Log HTML response body, don't parse as JSON});
Dependiendo del objetivo de API, es posible que deba incluir encabezados de solicitud específicos para garantizar que se devuelva JSON.
Causa
La script intenta utilizar JSON.parse()
en el cuerpo de una respuesta después de realizar una solicitud y espera que el extremo devuelva JSON, pero en su lugar se devolvió HTML.
Problema
JSON.parse()
Se le pasó un parámetro indefinido, pero se esperaba una cadena JSON.
Solución
Solucione la causa del error de solicitud. Los detalles sobre la causa de los errores de solicitud se pueden encontrar en el objeto de error pasado a la función de devolución de llamada de solicitud.
Ejemplo:
$http.get("http://www.newrelic.com", function (error, response, body) { if (error) { throw new Error(error); }
var bodyJson = JSON.parse(body); console.log(bodyJson); // Log response body});
Causa
Esto puede ocurrir en el monitor de API con secuencia de comandos cuando se realiza una solicitud de API y luego se intenta analizar la respuesta de la solicitud dentro de la función de devolución de llamada. El cuerpo de la respuesta se pasa a JSON.parse()
sin comprobar primero si el cuerpo de la respuesta no está definido.
Un cuerpo de respuesta indefinido suele deberse a un error de solicitud. Si no hay un manejo de errores para evitar que el código analice el cuerpo de la respuesta, se producirá esta falla del monitor.
Problema
El objeto de respuesta (y por lo tanto response.statusCode) en una devolución de llamada de solicitud de API no está definido.
Solución
Solucione la causa del error de solicitud. Los detalles sobre la causa de los errores de solicitud se pueden encontrar en el objeto de error pasado a la función de devolución de llamada de solicitud.
Ejemplo:
$http.get("http://www.newrelic.com", function (error, response, body) { if (error) { throw new Error(error); } console.log(response.statusCode);});
Causa
Este error ocurre cuando hubo un error al completar la solicitud de API (por ejemplo, no se pudo acceder al servidor, no se pudo resolver DNS). En estas instancias, la solicitud no se completó, por lo que el objeto de respuesta en los argumentos de la función de devolución de llamada no está definido.
Si no hay un manejo de errores para evitar el código que verifica el código de estado de respuesta, se producirá esta falla del monitor.