셀레니엄 웹 드라이브 4.1 API 사용하여 펼쳐보기 모니터를 실행하려면 펼쳐보기의 구문이 변수 $selenium
및 $webDriver
을 사용하는지 확인하세요. 셀레니엄 웹 드라이버 API 3.6.0에 접속하려면, 0.5.0+ 브라우저 참조 문서 에 설명된 대로 변수 $driver
및 $browser
사용합니다.
특히:
$selenium
selenium-webdriver
모듈의 모든 내보내기를 제공합니다(예:ActionSequence
,Button
,By
또는WebElement
). 이는 이전 런타임의$driver
사용에 매핑됩니다.$webDriver
selenium-webdriver.WebDriver()
의 합성 모니터링 인스턴스입니다.get()
및findElement()
같은 기본 기본WebDriver
API와 일부 합성 사용자 지정 API를 노출합니다. 이는 이전 런타임의$browser
사용에 매핑됩니다.$headers
요청 헤더를 수정하는 기능을 제공합니다. 이 기능은 여러$browser
메서드의 이전 런타임에서 사용할 수 있었습니다.$urlFilter
특정 도메인에 대한 요청을 제한하기 위해 허용 및 거부 목록을 생성하는 기능을 제공합니다. 이 기능은 여러$browser
메서드의 이전 런타임에서 사용할 수 있었습니다.
이전 모니터 버전을 사용하는 경우 모니터 버전 0.5.0 및 0.6.0 설명서 또는 모니터 버전 0.4.0 이하 설명서 를 참조하십시오.
모니터 버전 및 런타임 차이점에 대한 자세한 내용은 런타임 환경 을 참조하세요.
중요
Selenium WebDriver 약속 관리자/제어 흐름은 수동으로 약속/비동기 기능을 관리하지 않고도 일부 기능을 순서대로 실행할 수 있도록 했습니다. 이것은 Selenium WebDriver 4.0에서 제거되었으며 런타임에서 더 이상 사용할 수 없습니다. 모든 비동기 함수와 프라미스는 await
또는 .then
프라미스 체인으로 관리해야 합니다. 이렇게 하면 스크립트 기능이 예상 순서대로 실행됩니다.
몇 가지 일반적인 사용 예는 스크립팅된 브라우저 모니터 소개를참조하십시오.
최상위 기능: 스크립트 작성
New Relic은 $webDriver
인스턴스에서 직접 최상위 함수를 호출합니다. 이들은 많은 기본 스크립팅 가능한 작업을 다루는 광범위한 기능을 제공합니다.
waitForAndFindElement(locator, timeout)
및 waitForPendingRequests(timeout)
메서드는 런타임에서 제거되었으며 $webDriver
를 통해 사용할 수 없습니다. 이전 버전과의 호환성을 사용할 수 있지만 더 이상 사용되지 않는 것으로 간주되어 향후 런타임에서 제거될 수 있습니다. 다음 코드 조각을 사용하여 해당 기능을 교체합니다.
함수 | 설명 |
---|---|
| 이 드라이버를 사용하여 새 동작 시퀀스를 만듭니다. 사용 가능한 작업 목록은 ActionSequence 를 참조하십시오. 반환 값: 무효 |
| 값이 반환 값: 무효 |
| 런타임에 여러 헤더를 추가합니다. 반환 값: 무효 |
| 현재 구성된 헤더의 맵을 반환합니다. 반환 값: 약속 |
| 현재 구성된 헤더의 맵을 반환합니다. 반환 값: 지도 |
| 현재 구성된 헤더 키의 배열을 반환합니다. 반환 값: 배열 |
| 이 헤더가 있는지 여부를 나타내는 bool을 반환합니다. 반환 값: 부울 |
| 런타임에서 특정 헤더를 삭제합니다. 반환 값: 무효 |
| 런타임에서 인수의 모든 헤더를 삭제합니다. 반환 값: 무효 |
| 런타임에서 모든 헤더를 삭제합니다. 반환 값: 무효 |
| 거부 목록에 인수 배열의 모든 호스트 이름을 추가합니다. 와일드카드 사용을 허용합니다. 반환 값: 약속 |
| 허용 목록에 인수 배열의 모든 호스트 이름을 추가합니다. 와일드카드 사용을 허용합니다. 반환 값: 약속 |
| 거부 목록에서 인수의 모든 호스트 이름을 제거합니다. 반환 값: 약속 |
| 허용 목록에서 인수의 모든 호스트 이름을 제거합니다. 반환 값: 약속 |
| 현재 선택한 프레임 또는 창의 컨텍스트에서 비동기 JavaScript를 실행하도록 명령을 예약합니다. 반환 값: 약속 |
| 현재 선택한 프레임 또는 창의 컨텍스트에서 JavaScript를 실행하도록 명령을 예약합니다. 반환 값: 약속 |
| 페이지에서 요소를 찾는 명령을 예약합니다. 찾을 수 없으면 종합 모니터링에서 오류를 반환합니다. 반환 값: WebElementPromise |
| 페이지에서 여러 요소를 검색 하도록 명령을 예약합니다. 반환 값: 약속 |
| 합성 브라우저에서 웹 페이지를 로드합니다. 반환 값: 약속 |
| 사용 가능한 창 핸들의 현재 목록을 검색하는 명령을 예약합니다. 반환 값: 약속 |
| 인스턴스의 기능으로 해결될 약속입니다. 반환 값: 약속 |
| 현재 페이지의 URL을 검색하는 명령을 예약합니다. 반환 값: 약속 |
| 현재 페이지의 소스를 검색하는 명령을 예약합니다. 반환된 페이지 소스는 기본 DOM을 나타냅니다. 웹 서버에서 보낸 응답과 같은 방식으로 형식화되거나 이스케이프될 것으로 기대하지 마십시오. 반환 값: 약속 |
| 이 클라이언트의 세션에 대한 약속입니다. 반환 값: 약속 |
| 현재 페이지의 제목을 검색하는 명령을 예약합니다. 반환 값: 약속 |
| 현재 창 핸들을 검색하는 명령을 예약합니다. 반환 값: 약속 |
| 이 인스턴스의 옵션 인터페이스입니다. 쿠키, 시간 초과 및 기타 창 옵션을 관리할 수 있습니다. 반환 값: 무효 |
| 이 인스턴스의 탐색 인터페이스(브라우저 기능 기록) 입니다. 반환 값: 무효 |
| 지정된 시간 동안 드라이버를 절전 모드로 전환하는 명령을 예약합니다. 반환 값: 약속 |
| 이 인스턴스의 대상 로케이터 인터페이스입니다. 반환 값: 무효 |
| 스크린샷을 찍도록 명령을 예약합니다. 반환 값: 약속 |
| 제공된 함수에서 정의한 대로 조건이 유지될 때까지 기다리도록 명령을 예약합니다. 반환 값: WebElement |
| 스크립트가 시작된 요청이 제한 시간까지 반환될 때까지 기다리도록 합니다. 비차단 리소스를 추적하는 데 유용합니다. 반환 값: 약속 |
거부 목록: 와일드카드 사용
브라우저 인스턴스의 거부 목록에 도메인을 추가하려면 와일드카드가 차단할 URL의 URL 구문과 일치해야 합니다.
전체 .com
거부 목록에는 다음 기능이 포함되어야 합니다.
함수 | 차단 조치 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
옵션: 브라우저 인스턴스 관리
이러한 기능은 쿠키, 시간 초과 및 창 크기와 같은 브라우저 인스턴스에 대한 옵션을 관리합니다. $webDriver.manage()
함수를 통해 이러한 옵션에 액세스합니다.
함수 | 설명 |
---|---|
| 쿠키를 추가하는 명령을 예약합니다.
반환 값: 약속 |
| 현재 페이지에 표시되는 모든 쿠키를 삭제하는 명령을 예약합니다. 반환 값: 약속 |
| 지정된 이름의 쿠키를 삭제하는 명령을 예약합니다. 이 명령은 현재 페이지에서 볼 수 있는 주어진 이름의 쿠키가 없는 경우 작동하지 않습니다. 반환 값: 약속 |
| 지정된 이름으로 쿠키를 검색하는 명령을 예약합니다. 그러한 쿠키가 없으면 null을 반환합니다. 쿠키는 WebDriver 유선 프로토콜에 설명된 대로 JSON 개체로 반환됩니다. 반환 값: 약속 |
| 현재 페이지에 표시되는 모든 쿠키를 검색하는 명령을 예약합니다. New Relic Syntheticcs는 WebDriver 유선 프로토콜에 설명된 대로 각 쿠키를 JSON 개체로 반환합니다. 반환 값: 약속 |
| 현재 스크립트, pageLoad 및 암시적 시간 초과를 반환합니다. 반환 값: 약속 |
| 요소가 즉시 존재하지 않는 경우 드라이버가 요소를 검색할 때 기다려야 하는 시간을 지정합니다. 대기 시간 초과를 대기 시간 초과를 늘리면 특히 XPath와 같은 느린 위치 전략에서 테스트 실행 시간이 증가하므로 주의하십시오. 기본값은 10초입니다. 반환 값: 약속 |
| 오류를 반환하기 전에 페이지 로드가 완료될 때까지 기다리는 시간을 설정합니다. 시간 제한이 음수이면 페이지 로드가 최대 180초 동안 지속될 수 있습니다. 기본값은 60초입니다. 반환 값: 약속 |
| 비동기 스크립트가 오류를 반환하기 전에 실행을 완료할 때까지 기다리는 시간(밀리초)을 설정합니다. 기본값은 30초입니다. 반환 값: 약속 |
| 화면의 왼쪽 상단 모서리와 창의 크기(너비 및 높이)를 기준으로 창의 현재 위치(x 및 y)를 검색합니다. 반환 값: 약속 |
| 현재 창을 최대화합니다. 반환 값: 약속 |
| 화면의 왼쪽 상단 모서리와 창의 크기(너비 및 높이)를 기준으로 창의 현재 위치(x 및 y)를 설정합니다. 반환 값: 약속 |
로케이터: 페이지 요소 찾기
로케이터는 locator
인스턴스를 생성하기 위한 팩토리 함수 모음입니다. 로케이터는 $webDriver.findElement
과 같은 함수에 전달할 수 있는 DOM 요소를 찾습니다. $selenium.By
를 통해 전화하세요.
함수 | 설명 |
---|---|
| 특정 클래스 이름을 가진 요소를 찾습니다. 반환된 로케이터는 CSS 선택기 반환 값: 로케이터 |
| CSS 선택기를 사용하여 요소를 찾습니다. 반환 값: 로케이터 |
| ID로 요소를 찾습니다. 반환 값: 로케이터 |
| 보이는 텍스트가 주어진 문자열과 일치하는 링크 요소를 찾습니다. 반환 값: 로케이터 |
| JavaScript 표현식을 평가하여 요소를 찾습니다. 반환 값: 로케이터 |
| name 속성이 주어진 값을 갖는 요소를 찾습니다. 반환 값: 로케이터 |
| 표시되는 getText 에 지정된 하위 문자열이 포함된 링크 요소를 찾습니다. 반환 값: 로케이터 |
| 주어진 태그 이름을 가진 요소를 찾습니다. 반환된 로케이터는 반환 값: 로케이터 |
| XPath 선택기와 일치하는 요소를 찾습니다. 반환 값: 로케이터 |
WebElement: 페이지 요소와 상호 작용
$webDriver.findElement
과 같은 함수가 WebElement 참조를 반환하면 이러한 함수를 사용하여 해당 요소와 상호작용할 수 있습니다. 예를 들어 버튼을 클릭하고 텍스트를 보내 입력을 구성하고 테스트할 요소의 속성을 가져올 수 있습니다.
함수 | 설명 |
---|---|
| 이 요소를 클릭합니다. 반환 값: 자체 참조 |
| 이 인스턴스가 나타내는 DOM 요소에 시퀀스를 입력하도록 명령을 예약합니다. 반환 값: WebElement |
| 이 요소의 태그/노드 이름을 쿼리하도록 명령을 예약합니다. 반환 값: WebElement |
| 이 인스턴스가 나타내는 요소의 계산된 스타일을 쿼리하도록 명령을 예약합니다. 요소가 부모로부터 명명된 스타일을 상속하는 경우 부모는 해당 값을 쿼리합니다. 가능한 경우 색상 값은 16진수 표현으로 변환됩니다(예: 반환 값: 약속 |
| 요소의 지정된 속성 값을 쿼리하는 명령을 예약합니다. 반환 값: 약속 |
| 선행 또는 후행 공백 없이 하위 요소를 포함하여 이 요소의 가시적(CSS에 의해 숨겨지지 않음) 반환 값: 약속 |
| 이 인스턴스가 나타내는 DOM 요소가 disabled 속성에 따라 활성화되었는지 여부를 쿼리하는 명령을 예약합니다. 반환 값: 약속 |
| 이 요소가 선택되었는지 여부를 쿼리하는 명령을 예약합니다. 반환 값: 약속 |
| 이 요소(또는 이 요소가 반환 값: 약속 |
| 이 요소의 값을 지우는 명령을 예약합니다. 반환 값: 약속 |
| 이 요소가 현재 표시되는지 여부를 테스트하는 명령을 예약합니다. 반환 값: 약속 |
ActionSequence: 여러 작업 연결
액션 시퀀스는 웹사이트와 복잡한 사용자 상호작용을 생성할 수 있습니다.
- 새 작업 시퀀스를 만들려면
$webDriver.actions()
을 사용합니다. - 여러 작업을 하나의 시퀀스로 연결하려면 각각 뒤에
perform()
을 포함합니다. 이것은 단일 동작 시퀀스를 포함하여 개별 시퀀스를 실행한 다음 종료합니다.
다음 표에는 사용 가능한 작업 목록이 나와 있습니다. 자세한 내용 은 GitHub의 WebDriver ActionSequence 설명서를 참조하십시오.
함수 | 설명 |
---|---|
| 마우스 버튼을 클릭합니다. 요소가 제공되면 마우스가 먼저 해당 요소의 중앙으로 이동합니다. 이는 반환 값: actionsequence |
| 마우스 버튼을 두 번 클릭합니다. 요소가 제공되면 마우스가 먼저 해당 요소의 중앙으로 이동합니다. 반환 값: actionsequence |
| 드래그 앤 드롭 조작을 수행하기 위한 편의 기능. 대상 요소는 다른 요소의 위치로 이동하거나 오프셋(픽셀 단위)만큼 이동할 수 있습니다. 위치는 반환 값: actionsequence |
| 수정자 키 누름을 수행합니다. 반환 값: actionsequence |
| 수정자 키 해제를 수행합니다. 릴리스는 현재 포커스가 있는 요소를 대상으로 합니다. 반환 값: actionsequence |
| 마우스 버튼을 누릅니다. 이 순서로 호출되는지 다른 순서로 호출되는지에 관계없이 반환 값: actionsequence |
| 마우스 버튼을 놓습니다. 반환 값: actionsequence |
| 마우스를 움직입니다. 이동할 위치는 마우스의 현재 위치, 요소의 왼쪽 상단 모서리에 상대적인 오프셋 또는 요소(이 경우 요소의 중간이 사용됨)로 지정할 수 있습니다. 반환 값: actionsequence |
| 이 작업 시퀀스를 실행합니다. 반환 값: 약속 |
| 여러 키 입력을 시뮬레이션합니다. 시퀀스에서 발견된 각 수정자는 다시 만날 때까지 해제되지 않습니다. 모든 주요 이벤트는 현재 포커스가 있는 요소를 대상으로 합니다. 지원되는 영숫자가 아닌 키의 전체 목록은 GitHub의 WebDriver 열거형 키 설명서를 참조하세요. 반환 값: actionsequence |
약속: 작업을 시퀀스에 연결
Promise에서 직접 함수를 실행할 수도 있습니다. 종합 모니터링은 기본 Node.js 환경이며 표준 Node.js 약속을 사용합니다.
이러한 함수는 약속의 상태를 평가하고 취소하는 등의 작업을 수행합니다. 특히 then()
함수와 그 형제 finally()
및 catch()
를 사용하여 일련의 작업을 만들 수 있습니다. 자세한 내용은시퀀스 작업 을 참조하십시오.
팁
.then 구문을 사용하여 약속 연결을 지원하는 것 외에도 이 런타임은 async-await 구문도 지원합니다.
함수 | 설명 |
---|---|
| 이 약속의 값이 아직 계산 중인지 여부입니다. 반환 값: 부울 |
| 이 인스턴스가 확인될 때 리스너를 등록합니다. 이것은 스크립트에서 동기 작업을 연결하는 데 사용되는 기본 기능입니다. 반환 값: 약속 |
| 프라미스의 값이 성공적으로 계산되었는지 여부에 관계없이 이 프라미스가 확인될 때 호출할 수신기를 등록합니다. 반환 값: 약속 |
| 이 약속이 거부될 때 리스너를 등록합니다. 반환 값: 약속 |
탐색: 브라우저 기록을 통해 이동
$webDriver.navigate()
함수는 브라우저 기록을 앞뒤로 이동하고, 페이지를 새로고침하고, 새 페이지로 이동할 수 있는 다양한 기능을 제공합니다.
함수 | 설명 |
---|---|
| 브라우저 기록에서 한 단계 뒤로 이동합니다. 반환 값: 무효 |
| 브라우저 기록에서 한 단계 앞으로 이동합니다. 반환 값: 무효 |
| 현재 페이지를 새로 고칩니다. 반환 값: 무효 |
| 현재 브라우저 창에서 새 웹페이지를 로드합니다. 반환 값: 무효 |
조건: 일시 중지 및 조건 대기
팁
공식 문서에서 Selenium의 wait에 대해 자세히 알아볼 수 있습니다.
$webDriver.wait
, until
과 함께 사용하면 조건이 일치할 때까지 스크립트 실행이 일시 중지됩니다. 자세한 내용은 Selenium의 WebDriver until
설명서 를 참조하십시오.
다음은 $selenium.until.Condition
에 사용할 수 있는 기능입니다.
함수 | 설명 |
---|---|
| 입력 드라이버가 지정된 프레임으로 전환할 수 있을 때까지 기다리는 조건을 만듭니다. 대상 프레임은 다음과 같이 지정할 수 있습니다.
|
| 경고가 열리기를 기다리는 조건을 만듭니다. 성공하면 반환된 약속이 열린 경고에 대한 핸들로 이행됩니다. 반환 값: 조건 |
| 주어진 요소가 비활성화될 때까지 기다리는 조건을 만듭니다. 반환 값: 조건 |
| 주어진 요소가 활성화되기를 기다리는 조건을 만듭니다. 반환 값: 조건 |
| 주어진 요소가 DOM에 있지만 사용자에게 표시되지 않을 때까지 기다리는 조건을 만듭니다. 반환 값: 조건 |
| 주어진 요소가 표시될 때까지 기다리는 조건을 만듭니다. 반환 값: 조건 |
| 주어진 요소가 선택되기를 기다리는 조건을 만듭니다. 반환 값: 조건 |
| 주어진 로케이터로 요소를 찾을 때까지 반복되는 조건을 만듭니다. 반환 값: 조건 |
| 주어진 로케이터로 적어도 하나의 요소를 찾을 때까지 반복되는 조건을 생성합니다. 반환 값: 조건 N |
| 주어진 요소의 보이는 텍스트가 주어진 부분 문자열을 포함할 때까지 기다리는 조건을 생성합니다. 반환 값: 조건 |
| 대소문자를 구분합니다. 주어진 요소의 보이는 텍스트가 주어진 텍스트와 정확히 일치하기를 기다리는 조건을 만듭니다. 반환 값: 조건 N |
| 주어진 요소의 보이는 텍스트가 정규식과 일치하기를 기다리는 조건을 만듭니다. 반환 값: 조건 |
| 주어진 요소가 부실해질 때까지 기다리는 조건을 만듭니다. 요소는 DOM에서 제거되거나 새 페이지가 로드되면 오래된 것으로 간주됩니다. 반환 값: 조건 |
| 현재 페이지의 제목에 지정된 하위 문자열이 포함될 때까지 기다리는 조건을 만듭니다. 반환 값: 조건 |
| 현재 페이지의 제목이 주어진 값과 일치할 때까지 기다리는 조건을 만듭니다. 반환 값: 조건 |
| 현재 페이지의 제목이 주어진 정규식과 일치할 때까지 기다리는 조건을 만듭니다. 반환 값: 조건 |
고급 예제
다음 예에서는 코드를 기능 섹션(상수, 의존성/종속성, 설정, 페이지 요소, 함수 및 펼쳐보기 시작)으로 구분합니다. 다음을 수행할 수 있는 방법을 보여줍니다.
- 더 나은 성능을 위해 오류 기간을 최소화하도록 시간 초과를 구성합니다.
- CSS 또는 ID로 요소를 찾습니다.
waitForAndFindElement
정의합니다.console.log()
사용하여 스크립트 로그를 구성하고 어설션 실패 또는 시간 초과 문제를 찾아냅니다.- 실패 단계를 식별하는 유용한 오류 메시지를 발생시키는 try/catch 블록을 사용하여 오류를 처리합니다.
- 스크립트 전체를 비동기 함수 내부에서 실행하므로 최상위 수준
await
을 사용할 수 있습니다.
/** * Script Name: Advanced Example * Author: New Relic * Version: 1.6 */
// -------------------- CONSTANTSconst SCRIPT_NAME = "Best Practices - Chrome 100" // name to record in script logconst IMPLICIT_TIMEOUT = 3000 // default implicit timeout is 10 secondsconst PAGE_LOAD_TIMEOUT = 60000 // default page load timeout is 60 seconds, fail early to prevent long duration timeoutsconst SCRIPT_TIMEOUT = 20000 // default script timeout is 30 secondsconst USER_AGENT = "default" // set the user agent for Chromeconst PROTOCOL = "https://" // set the protocolconst USERNAME = "" // username:const PASSWORD = "" // password@const DOMAIN = "docs.newrelic.com" // your domainconst PATH = "/docs/new-relic-solutions/get-started/intro-new-relic/" // path to main pageconst CHECK = "Get started with New Relic" // text to match on pageconst AUTH = USERNAME + PASSWORD // could be stored as secure credentialsconst MAIN_URL = PROTOCOL + AUTH + DOMAIN + PATH
// -------------------- DEPENDENCIESconst assert = require("assert")
// -------------------- CONFIGURATIONawait $webDriver.manage().setTimeouts({ implicit: IMPLICIT_TIMEOUT, // sets element load timeout pageLoad: PAGE_LOAD_TIMEOUT, // sets page load timeout script: SCRIPT_TIMEOUT // sets script timeout})
// -------------------- ELEMENTSconst By = $selenium.Byconst loc = { title: By.css("#gatsby-focus-wrapper > div.css-1uz5ayg > div > main > div > h1"), start: [ { step: 'signup', selector: By.id("sign-up-for-new-relic-if-you-havent-already") }, { step: 'add', selector: By.id("add-your-data") }, { step: 'explore', selector: By.id("explore-your-data") }, { step: 'query', selector: By.id("query-your-data") }, { step: 'dashboard', selector: By.id("set-up-a-dashboard") }, { step: 'alerts', selector: By.id("configure-alerts") } ]}
// -------------------- FUNCTIONS// for backwards compatibility with legacy runtimesasync function waitForAndFindElement(locator, timeout) { const element = await $webDriver.wait( $selenium.until.elementLocated(locator), timeout, "Timed-out waiting for element to be located using: " + locator ) await $webDriver.wait( $selenium.until.elementIsVisible(element), timeout, "Timed-out waiting for element to be visible using ${element}" ) return await $webDriver.findElement(locator)}
// -------------------- START OF SCRIPT// Start loggingconst start_time = new Date()console.log("Starting synthetics script: " + SCRIPT_NAME)
// confirm timeouts are setconst {implicit, pageLoad, script} = await $webDriver.manage().getTimeouts()console.log("Timeouts are set to:")console.log(" IMPLICIT: " + implicit / 1000 + "s")console.log(" PAGE LOAD: " + pageLoad / 1000 + "s")console.log(" SCRIPT: " + script / 1000 + "s")
// Setting User Agent is not then-able, so we do this first (if defined and not default)if (USER_AGENT && 0 !== USER_AGENT.trim().length && USER_AGENT != "default") { $headers.add("User-Agent", USER_AGENT) console.log("Setting User-Agent to " + USER_AGENT)}
// if an error happens at any step, script execution is halted and a failed result is returnedconsole.log("1. get: " + MAIN_URL)await $webDriver.get(MAIN_URL)
console.log("2. waitForAndFindElement: " + loc.title)const textBlock = await waitForAndFindElement(loc.title, IMPLICIT_TIMEOUT)
console.log("3. getText: " + CHECK)const text1 = await textBlock.getText()
console.log("4. assert.equal: " + text1)assert.equal(text1, CHECK, "title validation text not found")
console.log("5. takeScreenshot")await $webDriver.takeScreenshot()
console.log("6. findElement")loc.start.forEach(async function (nr, i) { let n = i + 1 try{ // verify each asset has loaded console.log(" " + n + ". " + nr.step + ": " + nr.selector) await $webDriver.findElement(nr.selector) }catch(exception){ console.error("Failure in Step 6." + n) throw exception }})
// End loggingconst end_time = new Date()
// Calculate the durationconst script_duration = (end_time - start_time) / 1000
// Log the timesconsole.log("Start time: " + start_time)console.log("End time: " + end_time)console.log("Duration: " + script_duration + "s")
Shadow DOM: 요소 찾기
런타임은 새로운 셀레니엄 웹 드라이버 메서드 getShadowRoot()
를 사용하여 Shadow DOM 요소에 액세스하는 것도 지원합니다.
findElement
또는 유사한 최상위 함수 를 사용하여 섀도우 호스트를 찾습니다. 이것은 shadow-root가 마운트되는 요소입니다.- 1단계에서 찾은 요소에서
getShadowRoot()
메서드를 사용하여 섀도우 루트를 가져옵니다. - 섀도우 루트를 사용하여 이제 findElement 또는 유사한 기능을 사용하여 섀도우 루트 내부의 요소를 찾을 수 있습니다. 여러 수준의 shadow DOM이 사용되는 경우 상호 작용해야 하는 요소가 포함된 shadow 루트 개체에 액세스할 때까지 이러한 단계를 반복해야 합니다.
팁
Chrome은 섀도우 루트 개체 내에서 XPath 로케이터 사용을 지원하지 않습니다. 다른 로케이터 옵션 을 사용하여 섀도우 루트 개체 내부의 요소를 찾습니다.
예시:
// Find the shadow hostlet myShadowHost = await $webDriver.findElement($selenium.By.id('exampleShadowHost'));// Get the shadow rootlet myShadowRoot = await myShadowHost.getShadowRoot();// Interact with an element inside the shadow rootlet el = await myShadowRoot.findElement($selenium.By.id('myButton'));await el.click();