Problema
O monitor Sintético Simple, Scripted ou Scripted API (sem ping) do seu New Relic relatou um erro, mas o aplicativo parece ter carregado corretamente. Para erros de ping e de monitor simples, consulte erros de monitor sem script.
Soluções
Abaixo estão algumas das mensagens de erro mais comuns do monitor sem ping.
Erros de browser simples ou com script
Problema
O script Sintético está tentando .click()
um elemento (Elemento A) no ponto (X,Y), mas outro elemento (Elemento B) está obscurecendo o elemento alvo.
Solução
Defina um tempo de espera personalizado, permitindo que uma condição específica seja atendida. Neste caso, até que a animação de carregamento não esteja mais visível:
.then(function () { return $browser.wait( $driver.until.elementIsNotVisible($browser.findElement($driver.By.id("LOADING"))), 10000 );});
Como alternativa, você pode definir um atraso de suspensão personalizado usando $browser.sleep(sleeptime_ms)
, paralisando a execução do script por um período de tempo especificado. Como esse é um tempo de espera fixo, que não leva em conta o aumento da latência da rede ou a degradação do desempenho do site, recomendamos usar a função .wait()
.
Dica
Isso não corrigirá .click()
problemas causados por cabeçalhos ou rodapés fixos. Nesses casos, pode ser necessário rolar manualmente para exibir o destino.
Causa
Isso acontece se o elemento alvo, no momento da função .click()
, estiver obscurecido por:
- Uma sobreposição de carregamento, modal ou pop-up
- Uma animação que revela o elemento alvo
- Um cabeçalho ou rodapé fixo
Problema
O elemento alvo não é visível para o Selenium Webdriver.
Solução
Verifique se o elemento alvo não possui as propriedades CSS de display: none
ou visibility: hidden
aplicadas.
Causa
Qualquer elemento que tenha uma propriedade CSS display: none
ou visibility: hidden
não será encontrado pelo Selenium Webdriver, pois o script procurará apenas elementos que estejam realmente visíveis para um usuário.
Problema
O Selenium Webdriver não conseguiu encontrar este elemento no DOM visível.
Solução
Para resolver este problema:
Confirme se o localizador de elemento usado para o elemento alvo é preciso. Evite usar
By.XPath
sempre que possível, pois ele está rigidamente vinculado à estrutura DOM da página e pode facilmente ficar desatualizado quando houver atualizações na página.Se o elemento estiver em um iframe, use
$browser.switchTo().frame(<index or element reference>
.Dica
Consulte a documentação do Selenium para obter mais informações sobre as funções
switchTo()
eTargetLocator()
.Causa
Os motivos comuns para esse erro incluem:
O elemento alvo não pode ser localizado por funções como:
$browser.findElement(locator: $driver.Locator)
ou$browser.waitForAndFindElement(locator: $driver.Locator [, timeout: number]
Isso pode ser devido a um problema de tempo. Por exemplo, o Webdriver está tentando localizar o elemento antes que a página seja carregada.
O elemento está em um iframe, que é um contexto de documento separado.
Problema
A execução do monitor com script atingiu o limite de tempo limite não configurável de 180 segundos e a execução foi encerrada.
Solução
Se este for um erro frequente, considere dividir as tarefas com script em um monitor com script separado.
Se parecer que uma tarefa específica está fazendo com que o trabalho espere um período de tempo inaceitável, considere alterar o método pelo qual você está realizando essa tarefa. Por exemplo, alterar $browser.findElement(locator: $driver.Locator)
para $browser.waitForAndFindElement(locator: $driver.Locator [, timeout: number)
atribuiria à tarefa seu próprio tempo limite configurável.
Se você tiver diversas etapas nas quais a função $browser.waitForAndFindElement(locator, timeout)
é chamada, certifique-se de que a soma dos tempos limite fornecidos para essas etapas não exceda 180 segundos. Se você estiver achando difícil fazer isso, isso é um sinal de que o monitor provavelmente deve ser dividido em um script de monitor separado.
Causa
Todos os monitores com script Sintético possuem um tempo limite global máximo não configurável de 180s para execução de um script.
Se um script não for concluído após 180 segundos, a tarefa será encerrada. Se isso acontecer de forma consistente, pode ser um sinal de que um script está demorando muito para ser concluído ou que o trabalho está aguardando um longo período de tempo enquanto tenta executar uma tarefa com script.
Problema
O script API test ou monitor de browser com parece estar em execução, mas está retornando este erro.
Solução
Certifique-se de que $http.get()
ou $browser.get()
estejam sendo chamados adequadamente e gerando tráfego.
Para monitor de API com script, se você estiver usando uma opção de solicitação para ativar um agente HTTP não instrumentado nos bastidores, especifique um de nossos agentes HTTP instrumentados usando uma das opções de solicitação de agente abaixo:
$globalAgents.http
$globalAgents.https
Exemplo:
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
Isso ocorre em execuções monitor com script quando o cliente HTTP ($http em monitores de API com script) ou browser Chrome ($browser em monitor de browser com script) não é usado para gerar tráfego HTTP.
Em alguns casos, certas opções de solicitação no monitor de API podem forçar um novo agente HTTP, que não seja instrumentado por monitoramento sintético, a ser usado para coletar o tráfego HTTP.
Problema
O objeto $network
usado para configurar proxies de monitor não está disponível para o tempo de execução desse monitor.
Solução
Se o seu monitor foi criado antes da versão do tempo de execução 0.4.0, crie um novo monitor para aproveitar o tempo de execução mais recente. A versão atual do tempo de execução do seu monitor é mostrada na parte superior das configurações do monitor.
Para obter mais informações, consulte Ambientes de tempo de execução da versão do monitor com script.
Causa
Este erro ocorre ao tentar usar $network
em um monitor com tempo de execução igual ou inferior a 0.2.2. O proxy do tráfego do monitor foi introduzido no tempo de execução do monitor versão 0.4.0, fazendo com que esse método seja avaliado como indefinido em tempos de execução de monitor anteriores.
Problema
Este erro indica que o trabalho atingiu o limite de tempo limite do contêiner docker e o script foi encerrado.
Solução
Se este for um erro frequente, considere dividir as tarefas com script em um monitor com script separado.
Se parecer que uma tarefa específica está fazendo com que o trabalho espere um período de tempo inaceitável, considere alterar o método pelo qual você está realizando essa tarefa. Por exemplo, alterar $browser.findElement(locator: $driver.Locator)
para $browser.waitForAndFindElement(locator: $driver.Locator [, timeout: number)
atribuiria à tarefa seu próprio tempo limite configurável.
Se você tiver diversas etapas nas quais a função $browser.waitForAndFindElement(locator, timeout)
é chamada, certifique-se de que a soma dos tempos limite fornecidos para essas etapas não exceda 180 segundos. Se você estiver achando difícil fazer isso, isso é um sinal de que o monitor provavelmente deve ser dividido em um script de monitor separado.
Causa
Todos os monitores com script Sintético possuem um tempo limite global máximo não configurável de 180s para execução de um script.
Se um script não for concluído após 180 segundos, a tarefa será encerrada. Se isso acontecer de forma consistente, pode ser um sinal de que um script está demorando muito para ser concluído ou que o trabalho está aguardando um longo período de tempo enquanto tenta executar uma tarefa com script.
Problema
A página de destino foi carregada, mas houve uma alteração em um elemento entre a execução de um localizador de elemento e uma ação sendo executada no elemento.
Solução
Configure seu browser com script para aguardar até que a página seja configurada antes de executar uma ação findElement()
. Isso pode ser feito definindo um tempo de espera personalizado, usando a função $browser.wait(fn, timeout)
antes da chamada findElement, para aguardar uma condição que indique um estado de página estabelecido. Isso tornará menos provável que a manipulação do DOM faça com que uma referência fique obsoleta.
Como alternativa, você pode definir um atraso de suspensão personalizado usando $browser.sleep(sleeptime_ms)
, paralisando a execução do script por um período de tempo especificado. Como esse é um tempo de espera fixo, que não leva em conta o aumento da latência da rede ou a degradação do desempenho do site, recomendamos usar a função .wait()
.
Causa
Esse erro geralmente ocorre quando o script tenta .click()
um elemento após usar a função findElement()
ou waitForAndFindElement()
.
Se o DOM mudou entre o momento em que o localizador de elemento foi gerado e a ação foi executada no elemento, esse erro ocorrerá porque o elemento real foi alterado.
Por exemplo: a função findElement()
é usada para gerar uma referência de elemento enquanto o script da página manipula ativamente o DOM. O DOM é então alterado, fazendo com que a referência gerada anteriormente fique obsoleta. A referência agora desatualizada é usada em uma tentativa de executar uma ação .click()
, resultando nesta falha do monitor.
Dica
Para obter mais informações, consulte a documentação do Selenium sobre exceções de referência de elementos obsoletos.
Problema
A função waitForAndFindElement(<locator>, <timeout>)
não conseguiu localizar um elemento dentro do tempo limite fornecido.
Solução
Confirme se o localizador de elemento usado para o elemento alvo é preciso. Evite usar By.XPath()
sempre que possível, pois ele está rigidamente vinculado à estrutura DOM da página e pode facilmente ficar desatualizado quando houver atualizações na página.
Causa
O elemento alvo não existia na página quando a função waitForAndFindElement(<locator>, <timeout>)
foi chamada. Isso pode ser causado pelo fato de a página de destino não estar no estado esperado.
Os motivos comuns para esse erro incluem:
- Há um problema legítimo com o site de destino.
- O localizador de elemento usado está incorreto.
- O site destino foi alterado, exigindo a revisão da escrita Sintético.
- A ação anterior no script não foi concluída com êxito, fazendo com que a página ficasse em um estado inesperado quando a chamada waitForAndFindElement() subsequente foi iniciada.
Problema
A página de destino foi carregada com sucesso, mas retornou o erro:
TimeoutError: Tempo limite de carregamento da página expirou (não foi possível concluir todas as solicitações de rede no prazo)
Solução
Se as falhas começaram repentinamente, investigue quaisquer solicitações que possam estar bloqueando ou atrasando o evento de carregamento da página. Se você não tiver certeza de qual solicitação está causando o erro, use a visualização da linha do tempo para identificar quaisquer solicitações HTTP de longa execução.
Se a página frequentemente não consegue carregar totalmente dentro do tempo limite atual, defina um tempo limite de carregamento de página personalizado usando a função $browser.manage().timeouts().pageLoadTimeout(ms: number)
.
Causa
A página de destino foi carregada com êxito, mas o evento de carregamento da página não foi acionado dentro do tempo limite de carregamento da página definido na função .pageLoadTimeout()
.
Há vários motivos pelos quais você pode ver essa mensagem de erro, incluindo:
- Uma solicitação de recurso bloqueada na página atrasou o carregamento da página.
- Uma solicitação de recurso processada mais lentamente que o normal devido a um problema de rede subjacente.
- Um recurso dependente na página bloqueou o evento de carregamento do iframe.
Problema
A função isElementPresent()
, utilizada pelo monitor Sintético com tempo de execução >= 0.5.0, foi descontinuada no Selenium 3.
Solução
Para continuar a usar esta função após a depreciação, você precisará criar uma versão personalizada desta função, como:
return $browser.findElements(ele).then(function (found) { return found.length > 0;});
Exemplo de uso, que retornaria verdadeiro:
$browser .get("https://www.newrelic.com") .then(function () { return isElementPresent($driver.By.id("nav_signup")); }) .then(function (found) { return console.log(found); });
Causa
Isso pode ocorrer ao tentar usar um script de script com do browser de um monitor mais antigo (<= 0.4.1 runtime) com um monitor mais recente (>= 0.5.0) tempo de execução.
Erros de monitor de API com script
Problema
O script API test ou monitor de browser com parece estar em execução, mas está retornando este erro.
Solução
Certifique-se de que $http.get()
ou $browser.get()
estejam sendo chamados adequadamente e gerando tráfego.
Para monitor de API com script, se você estiver usando uma opção de solicitação para ativar um agente HTTP não instrumentado nos bastidores, especifique um de nossos agentes HTTP instrumentados usando uma das opções de solicitação de agente abaixo:
$globalAgents.http
$globalAgents.https
Exemplo:
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
Isso ocorre em execuções monitor com script quando o cliente HTTP ($http em monitores de API com script) ou browser Chrome ($browser em monitor de browser com script) não é usado para gerar tráfego HTTP.
Em alguns casos, certas opções de solicitação no monitor de API podem forçar um novo agente HTTP, que não seja instrumentado por monitoramento sintético, a ser usado para coletar o tráfego HTTP.
Problema
O objeto $network
usado para configurar proxies de monitor não está disponível para o tempo de execução desse monitor.
Solução
Se o seu monitor foi criado antes da versão do tempo de execução 0.4.0, crie um novo monitor para aproveitar o tempo de execução mais recente. A versão atual do tempo de execução do seu monitoré mostrada na parte superior da página Configurações do monitor.
Para obter mais informações, consulte Ambientes de tempo de execução da versão do monitor com script.
Causa
Este erro ocorre ao tentar usar $network
em um monitor com tempo de execução igual ou inferior a 0.2.2. O proxy do tráfego do monitor foi introduzido no tempo de execução do monitor versão 0.4.0, fazendo com que esse método seja avaliado como indefinido em tempos de execução de monitor anteriores.
Problema
JSON.parse()
foi passada uma string que começa com o caractere < e provavelmente é HTML, em vez de JSON.
Solução
Certifique-se de que o endpoint de destino esteja retornando o corpo de resposta esperado. Você pode fazer isso registrando o corpo da resposta no retorno de chamada, antes de tentar analisar.
Exemplo:
$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});
Dependendo dos endpoints de destino da API, pode ser necessário incluir cabeçalhos de solicitação específicos para garantir que o JSON seja retornado.
Causa
O script está tentando usar JSON.parse()
em um corpo de resposta depois que uma solicitação é feita e espera que o endpoint retorne JSON, mas HTML foi retornado.
Problema
JSON.parse()
foi passado um parâmetro indefinido, mas esperava uma string JSON.
Solução
Solucione a causa do erro de solicitação. Detalhes sobre o que está causando erros de solicitação podem ser encontrados no objeto de erro passado para a função de retorno de chamada de solicitação.
Exemplo:
$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
Isso pode ocorrer no monitor de API com script ao executar uma solicitação de API e, em seguida, tentar analisar a resposta da solicitação dentro da função de retorno de chamada. O corpo da resposta é passado para JSON.parse()
sem verificar primeiro se o corpo da resposta está indefinido.
Um corpo de resposta indefinido geralmente é causado por um erro de solicitação. Se não houver tratamento de erros para impedir o código que analisa o corpo da resposta, ocorrerá essa falha do monitor.
Problema
O objeto de resposta (e, portanto, response.statusCode) em um retorno de chamada de solicitação de API é indefinido.
Solução
Solucione a causa do erro de solicitação. Detalhes sobre o que está causando erros de solicitação podem ser encontrados no objeto de erro passado para a função de retorno de chamada de solicitação.
Exemplo:
$http.get("http://www.newrelic.com", function (error, response, body) { if (error) { throw new Error(error); } console.log(response.statusCode);});
Causa
Este erro ocorre quando houve um erro ao concluir a solicitação da API (por exemplo, não foi possível acessar o servidor, não foi possível resolver o DNS). Nessas instâncias, a solicitação não foi concluída, portanto o objeto de resposta nos argumentos da função de retorno de chamada é indefinido.
Se não houver tratamento de erros para evitar o código que verifica o código de status de resposta, ocorrerá essa falha do monitor.