문제
New Relic의 합성 Simple, Scripted 또는 Scripted API(non-ping) 모니터 가 오류를 보고했지만 애플리케이션이 올바르게 로드된 것으로 보입니다. ping 및 단순 모니터 오류 의 경우 스크립팅되지 않은 모니터 오류를 참조하십시오.
솔루션
다음은 가장 일반적인 비 핑 모니터 오류 메시지 중 일부입니다.
단순 또는 스크립트 브라우저 오류
문제
합성 스크립트가 (X,Y) 지점에서 요소(요소 A)를 .click()
하려고 시도하지만 다른 요소(요소 B)가 대상 요소를 가리고 있습니다.
해결책
특정 조건이 충족될 때까지 시간을 허용하여 사용자 지정 대기 시간을 설정합니다. 이 경우 로딩 애니메이션이 더 이상 표시되지 않을 때까지:
.then(function () { return $browser.wait( $driver.until.elementIsNotVisible($browser.findElement($driver.By.id("LOADING"))), 10000 );});
또는 $browser.sleep(sleeptime_ms)
을 사용하여 사용자 지정 절전 지연 을 설정하여 지정된 시간 동안 스크립트 실행을 지연시킬 수 있습니다. 이는 네트워크 지연 증가 또는 사이트 성능 저하를 고려하지 않는 고정된 대기 시간이므로 대신 .wait()
함수를 사용하는 것이 좋습니다.
팁
고정 머리글 또는 바닥글로 인해 발생하는 .click()
문제는 수정되지 않습니다. 이러한 경우 대상을 보기 위해 수동으로 스크롤해야 할 수 있습니다.
원인
이는 .click()
함수가 실행될 때 대상 요소가 다음에 의해 가려지면 발생합니다.
- 로딩 오버레이, 모달 또는 팝업
- 대상 요소를 드러내는 애니메이션
- 고정 머리글 또는 바닥글
문제
대상 요소는 Selenium WebDriver에 표시되지 않습니다.
해결책
대상 요소에 display: none
또는 visibility: hidden
의 CSS 속성이 적용되지 않았는지 확인합니다.
원인
스크립트가 사용자에게 실제로 표시되는 요소만 찾기 때문에 CSS 속성이 display: none
또는 visibility: hidden
인 요소는 Selenium WebDriver에서 찾을 수 없습니다.
문제
Selenium WebDriver가 보이는 DOM에서 이 요소를 찾을 수 없습니다.
해결책
이 문제를 해결하려면:
대상 요소에 사용 중인 요소 로케이터가 정확한지 확인합니다.
By.XPath
은 페이지의 DOM 구조에 단단히 연결되어 있고 페이지에 업데이트가 있을 때 쉽게 구식이 될 수 있으므로 가능한 한 사용하지 마십시오.요소가 iframe에 있는 경우
$browser.switchTo().frame(<index or element reference>
을 사용합니다.팁
switchTo()
및TargetLocator()
함수에 대한 자세한 내용은 Selenium 문서를 참조하세요.원인
이 오류의 일반적인 이유는 다음과 같습니다.
대상 요소는 다음과 같은 기능으로 찾을 수 없습니다.
$browser.findElement(locator: $driver.Locator)
또는$browser.waitForAndFindElement(locator: $driver.Locator [, timeout: number]
이는 타이밍 문제 때문일 수 있습니다. 예를 들어 WebDriver는 페이지가 로드되기 전에 요소를 찾으려고 합니다.
요소는 별도의 문서 컨텍스트인 iframe에 있습니다.
문제
스크립팅된 모니터 실행이 180초의 구성 불가능한 시간 초과 임계값에 도달하여 실행이 종료되었습니다.
해결책
이것이 자주 발생하는 오류인 경우 스크립팅된 작업을 별도의 스크립팅된 모니터로 나누는 것을 고려하십시오.
특정 작업으로 인해 작업이 허용할 수 없는 시간 동안 대기하는 것으로 나타나면 해당 작업을 수행하는 방법을 변경하는 것이 좋습니다. 예를 들어 $browser.findElement(locator: $driver.Locator)
을 $browser.waitForAndFindElement(locator: $driver.Locator [, timeout: number)
로 변경하면 작업에 구성 가능한 자체 시간 제한이 할당됩니다.
$browser.waitForAndFindElement(locator, timeout)
함수가 호출되는 단계가 여러 개 있는 경우 이러한 단계에 제공된 시간 초과의 합계가 180초를 초과하지 않는지 확인하세요. 이를 달성하기 어려운 경우, 모니터를 여러 개의 모니터 스크립트로 나누어야 할 수도 있습니다.
원인
모든 합성 스크립팅된 모니터에는 스크립트 실행에 대해 구성할 수 없는 최대 전역 180초 제한 시간이 있습니다.
스크립트가 180초 후에도 완료되지 않으면 작업이 종료됩니다. 이 문제가 지속적으로 발생하면 스크립트를 완료하는 데 너무 오래 걸리거나 스크립트된 작업을 수행하는 동안 작업이 오랜 시간 동안 대기하고 있다는 신호일 수 있습니다.
문제
API 테스트 또는 스크립팅된 브라우저 모니터가 실행 중인 것으로 보이지만 이 오류를 반환합니다.
해결책
$http.get()
또는 $browser.get()
이 적절하게 호출되고 트래픽을 생성하는지 확인하십시오.
스크립팅된 API 모니터의 경우 요청 옵션 을 사용하여 내부에서 계장되지 않은 HTTP 에이전트를 실행하는 경우 아래 에이전트 요청 옵션 중 하나를 사용하여 계측된 HTTP 에이전트 중 하나를 지정하십시오.
$globalAgents.http
$globalAgents.https
예시:
var options = {uri: "https://www.newrelic.com",agent: $globalAgents.https,agentOptions: {rejectUnauthorized: false,},strictSSL: false,};function callback(err, res, body) {//...}$http.get(options, callback);원인
이것은 HTTP 클라이언트(스크립트된 API 모니터의 $http) 또는 Chrome 브라우저(스크립트된 브라우저 모니터의 $browser)가 HTTP 트래픽을 생성하는 데 사용되지 않을 때 스크립트된 모니터 실행에서 발생합니다.
경우에 따라 API 모니터의 특정 요청 옵션 으로 인해 합성 모니터링으로 계측되지 않은 새 HTTP 에이전트를 사용하여 HTTP 트래픽을 수집할 수 있습니다.
문제
모니터 프록시 설정에 사용되는 $network
객체는 해당 모니터의 런타임 에 사용할 수 없습니다.
해결책
모니터가 0.4.0 런타임 릴리스 이전에 생성된 경우 최신 런타임을 활용하려면 새 모니터를 생성하십시오. 모니터의 현재 런타임 버전은 모니터 설정 상단에 표시됩니다.
자세한 정보는 스크립팅된 모니터 버전 런타임 환경 을 참조하십시오.
원인
이 오류는 런타임이 0.2.2 이하인 모니터에서 $network
를 사용하려고 할 때 발생합니다. 프록시 모니터 트래픽은 모니터 런타임 버전 0.4.0에 도입되어 이 메서드가 이전 모니터 런타임에서 정의되지 않은 것으로 평가되었습니다.
문제
이 오류는 작업이 Docker 컨테이너 시간 초과 임계값에 도달했고 스크립트가 종료되었음을 나타냅니다.
해결책
이것이 자주 발생하는 오류인 경우 스크립팅된 작업을 별도의 스크립팅된 모니터로 나누는 것을 고려하십시오.
특정 작업으로 인해 작업이 허용할 수 없는 시간 동안 대기하는 것으로 나타나면 해당 작업을 수행하는 방법을 변경하는 것이 좋습니다. 예를 들어 $browser.findElement(locator: $driver.Locator)
을 $browser.waitForAndFindElement(locator: $driver.Locator [, timeout: number)
로 변경하면 작업에 구성 가능한 자체 시간 제한이 할당됩니다.
$browser.waitForAndFindElement(locator, timeout)
함수가 호출되는 단계가 여러 개인 경우 이러한 단계에 대해 제공된 시간 초과의 합계가 180초를 초과하지 않는지 확인하십시오. 이 작업을 수행하는 것이 어렵다면 이는 모니터가 별도의 모니터 스크립트로 분할되어야 한다는 신호입니다.
원인
모든 합성 스크립팅된 모니터에는 스크립트 실행에 대해 구성할 수 없는 최대 전역 180초 제한 시간이 있습니다.
스크립트가 180초 후에도 완료되지 않으면 작업이 종료됩니다. 이 문제가 지속적으로 발생하면 스크립트를 완료하는 데 너무 오래 걸리거나 스크립트된 작업을 수행하는 동안 작업이 오랜 시간 동안 대기하고 있다는 신호일 수 있습니다.
문제
대상 페이지가 로드되었지만 요소 로케이터의 실행과 요소에서 실행 중인 작업 사이에 요소가 변경되었습니다.
해결책
findElement()
작업을 수행하기 전에 페이지가 해결될 때까지 기다리도록 스크립트된 브라우저를 설정합니다. 이것은 정착된 페이지 상태를 나타내는 조건을 기다리기 위해 findElement 호출 전에 $browser.wait(fn, timeout)
함수를 사용하여 사용자 정의 대기 시간 을 설정하여 수행할 수 있습니다. 이렇게 하면 DOM 조작으로 인해 참조가 부실해질 가능성이 줄어듭니다.
또는 $browser.sleep(sleeptime_ms)
을 사용하여 사용자 지정 절전 지연 을 설정하여 지정된 시간 동안 스크립트 실행을 지연시킬 수 있습니다. 이는 네트워크 지연 증가 또는 사이트 성능 저하를 고려하지 않는 고정된 대기 시간이므로 대신 .wait()
함수를 사용하는 것이 좋습니다.
원인
이 오류는 일반적으로 스크립트가 findElement()
또는 waitForAndFindElement()
함수를 사용한 후 .click()
요소를 시도할 때 발생합니다.
요소 로케이터가 생성된 시점과 요소에 대해 작업이 실행된 시점 사이에 DOM이 변경된 경우 실제 요소가 변경되었기 때문에 이 오류가 발생합니다.
예: findElement()
함수는 페이지의 스크립트가 DOM을 능동적으로 조작하는 동안 요소 참조를 생성하는 데 사용됩니다. 그런 다음 DOM이 변경되어 이전에 생성된 참조가 부실하게 됩니다. 이제 오래된 참조가 .click()
작업을 수행하는 데 사용되어 이 모니터가 실패합니다.
팁
자세한 내용은 Stale Element Reference Exceptions 에 대한 Selenium 설명서를 참조하세요.
문제
waitForAndFindElement(<locator>, <timeout>)
함수가 제공된 제한 시간 내에 요소를 찾지 못했습니다.
해결책
대상 요소에 사용 중인 요소 로케이터가 정확한지 확인합니다. By.XPath()
은 페이지의 DOM 구조에 단단히 연결되어 있고 페이지에 업데이트가 있을 때 쉽게 구식이 될 수 있으므로 가능한 한 사용하지 마십시오.
원인
waitForAndFindElement(<locator>, <timeout>)
함수가 호출될 때 페이지에 대상 요소가 없었습니다. 이는 대상 페이지가 예상된 상태가 아니기 때문에 발생할 수 있습니다.
이 오류의 일반적인 이유는 다음과 같습니다.
- 대상 사이트에 합법적인 문제가 있습니다.
- 사용 중인 요소 로케이터가 올바르지 않습니다.
- 대상 사이트가 변경되어 합성 스크립트를 수정해야 합니다.
- 스크립트의 이전 작업이 성공적으로 완료되지 않아 후속 waitForAndFindElement() 호출이 시작될 때 페이지가 예기치 않은 상태가 되었습니다.
문제
대상 페이지가 성공적으로 로드되었지만 오류가 반환되었습니다.
TimeoutError: 페이지 로드 시간 초과(모든 네트워크 요청을 제시간에 완료할 수 없음)
해결책
장애가 갑자기 시작된 경우 페이지 로드 이벤트를 차단하거나 지연시킬 수 있는 요청을 조사하십시오. 어떤 요청이 오류를 일으키는지 확실하지 않은 경우 타임라인 보기 를 사용하여 장기 실행 HTTP 요청을 식별하십시오.
페이지가 현재 시간 제한 내에 완전히 로드되지 않는 경우가 자주 있는 경우 $browser.manage().timeouts().pageLoadTimeout(ms: number)
함수를 사용하여 사용자 정의 페이지 로드 시간 제한 을 설정합니다.
원인
대상 페이지가 성공적으로 로드되었지만 .pageLoadTimeout()
함수에 설정된 페이지 로드 제한 시간 내에 페이지 로드 이벤트가 시작되지 않았습니다.
다음을 포함하여 이 오류 메시지가 표시되는 데는 여러 가지 이유가 있습니다.
- 페이지에서 차단된 리소스 요청으로 인해 페이지 로드가 지연되었습니다.
- 기본 네트워크 문제로 인해 리소스 요청이 평소보다 느리게 처리되었습니다.
- 페이지의 종속 리소스가 iframe 로드 이벤트를 차단했습니다.
문제
런타임이 0.5.0 이상인 합성 모니터에서 사용하는 isElementPresent()
함수는 Selenium 3에서 더 이상 사용되지 않습니다.
해결책
감가상각 후에도 이 기능을 계속 사용하려면 다음과 같이 이 기능의 사용자 정의 버전을 생성해야 합니다.
return $browser.findElements(ele).then(function (found) { return found.length > 0;});
true를 반환하는 사용 예:
$browser .get("https://www.newrelic.com") .then(function () { return isElementPresent($driver.By.id("nav_signup")); }) .then(function (found) { return console.log(found); });
원인
이것은 새로운 모니터( >= 0.5.0) 런타임과 함께 이전 모니터( <= 0.4.1 런타임)에서 스크립트된 브라우저 모니터 스크립트를 사용하려고 할 때 발생할 수 있습니다.
스크립팅된 API 모니터 오류
문제
API 테스트 또는 스크립팅된 브라우저 모니터가 실행 중인 것으로 보이지만 이 오류를 반환합니다.
해결책
$http.get()
또는 $browser.get()
이 적절하게 호출되고 트래픽을 생성하는지 확인하십시오.
스크립팅된 API 모니터의 경우 요청 옵션 을 사용하여 내부에서 계장되지 않은 HTTP 에이전트를 실행하는 경우 아래 에이전트 요청 옵션 중 하나를 사용하여 계측된 HTTP 에이전트 중 하나를 지정하십시오.
$globalAgents.http
$globalAgents.https
예시:
var options = {uri: "https://www.newrelic.com",agent: $globalAgents.https,agentOptions: {rejectUnauthorized: false,},strictSSL: false,};function callback(err, res, body) {// ...}$http.get(options, callback);원인
이것은 HTTP 클라이언트(스크립트된 API 모니터의 $http) 또는 Chrome 브라우저(스크립트된 브라우저 모니터의 $browser)가 HTTP 트래픽을 생성하는 데 사용되지 않을 때 스크립트된 모니터 실행에서 발생합니다.
경우에 따라 API 모니터의 특정 요청 옵션 으로 인해 합성 모니터링으로 계측되지 않은 새 HTTP 에이전트를 사용하여 HTTP 트래픽을 수집할 수 있습니다.
문제
모니터 프록시 설정에 사용되는 $network
객체는 해당 모니터의 런타임 에 사용할 수 없습니다.
해결책
모니터가 0.4.0 런타임 릴리스 이전에 생성된 경우 최신 런타임을 활용하려면 새 모니터를 생성하십시오. 모니터의 현재 런타임 버전은 모니터 설정 페이지 상단에 표시됩니다.
자세한 내용은 스크립팅된 모니터 버전 런타임 환경을 참조하세요.
원인
이 오류는 런타임이 0.2.2 이하인 모니터에서 $network
를 사용하려고 할 때 발생합니다. 프록시 모니터 트래픽은 모니터 런타임 버전 0.4.0에 도입되어 이 메서드가 이전 모니터 런타임에서 정의되지 않은 것으로 평가되었습니다.
문제
JSON.parse()
< 문자로 시작하고 JSON 대신 HTML일 가능성이 있는 문자열이 전달되었습니다.
해결책
대상 엔드포인트가 예상 응답 본문을 반환하는지 확인합니다. 구문 분석을 시도하기 전에 콜백에 응답 본문을 기록하여 이를 수행할 수 있습니다.
예시:
$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});
대상 API 엔드포인트에 따라 JSON이 반환되도록 특정 요청 헤더를 포함해야 할 수도 있습니다.
원인
스크립트는 요청이 이루어진 후 응답 본문에서 JSON.parse()
을 사용하려고 시도하고 엔드포인트가 JSON을 반환할 것으로 예상하지만 HTML이 대신 반환되었습니다.
문제
JSON.parse()
정의되지 않은 매개변수가 전달되었지만 JSON 문자열이 필요했습니다.
해결책
요청 오류의 원인을 해결하십시오. 요청 오류의 원인에 대한 자세한 내용은 요청 콜백 함수에 전달된 오류 개체에서 찾을 수 있습니다.
예시:
$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});
원인
이것은 API 요청을 수행한 다음 콜백 함수 내에서 요청 응답을 구문 분석하려고 할 때 Scripted API 모니터에서 발생할 수 있습니다. 먼저 응답 본문이 정의되지 않았는지 확인하지 않고 응답 본문이 JSON.parse()
에 전달됩니다.
정의되지 않은 응답 본문은 종종 요청 오류로 인해 발생합니다. 응답 본문을 파싱하는 코드를 방지하기 위한 오류 처리가 없으면 이 모니터 오류가 발생합니다.
문제
API 요청 콜백의 응답 객체(따라서 response.statusCode)가 정의되지 않았습니다.
해결책
요청 오류의 원인을 해결하십시오. 요청 오류의 원인에 대한 자세한 내용은 요청 콜백 함수에 전달된 오류 개체에서 찾을 수 있습니다.
예시:
$http.get("http://www.newrelic.com", function (error, response, body) { if (error) { throw new Error(error); } console.log(response.statusCode);});
원인
이 오류는 API 요청을 완료하는 동안 오류가 발생한 경우(예: 서버에 연결할 수 없음, DNS를 확인할 수 없음) 발생합니다. 이러한 경우 요청이 완료되지 않았으므로 콜백 함수 인수의 응답 개체가 정의되지 않았습니다.
응답 상태 코드를 확인하는 코드를 방지하기 위한 오류 처리가 없으면 이 모니터 오류가 발생합니다.