선택자
WebDriver 프로토콜은 요소를 쿼리하기 위한 여러 선택자 전략을 제공합니다. WebdriverIO는 요소 선택을 단순하게 유지하기 위해 이를 단순화합니다. 요소를 쿼리하는 명령이 $와 $$로 불리지만, 이들은 jQuery나 Sizzle Selector Engine과는 관련이 없습니다.
다양한 선택자가 있지만, 그 중 일부만이 올바른 요소를 찾는 탄력적인 방법을 제공합니다. 예 를 들어, 다음과 같은 버튼이 있다고 가정해 봅시다:
<button
id="main"
class="btn btn-large"
name="submission"
role="button"
data-testid="submit"
>
Submit
</button>
다음 선택자를 권장 및 권장하지 않습니다:
| 선택자 | 권장 여부 | 참고 |
|---|---|---|
$('button') | 🚨 절대 안 됨 | 최악 - 너무 일반적이고, 컨텍스트가 없음. |
$('.btn.btn-large') | 🚨 절대 안 됨 | 나쁨. 스타일링에 결합됨. 변경 가능성이 높음. |
$('#main') | ⚠️ 드물게 | 더 나음. 그러나 여전히 스타일링이나 JS 이벤트 리스너에 결합됨. |
$(() => document.queryElement('button')) | ⚠️ 드물게 | 효과적인 쿼리, 작성이 복잡함. |
$('button[name="submission"]') | ⚠️ 드물게 | HTML 시맨틱이 있는 name 속성에 결합됨. |
$('button[data-testid="submit"]') | ✅ 좋음 | 추가 속성이 필요하지만, 접근성과 연결되지 않음. |
$('aria/Submit') | ✅ 좋음 | 좋음. 사용자가 페이지와 상호작용하는 방식을 닮음. 번역이 업데이트될 때 테스트가 깨지지 않도록 번역 파일을 사용하는 것이 좋습니다. 참고: 이 선택자는 큰 페이지에서 다른 것보다 느릴 수 있습니다. |
$('button=Submit') | ✅ 항상 | 최상. 사용자가 페이지와 상호작용하는 방식을 닮고 빠릅니다. 번역이 업데이트될 때 테스트가 깨지지 않도록 번역 파일을 사용하는 것이 좋습니다. |
CSS 쿼리 선택자
달리 명시되지 않는 한, WebdriverIO는 CSS 선택자 패턴을 사용하여 요소를 쿼리합니다:
loading...
링크 텍스트
특정 텍스트가 포함된 앵커 요소를 가져오려면 등호(=)로 시작하는 텍스트를 쿼리하세요.
예를 들어:
loading...
다음과 같이 호출하여 이 요소를 쿼리할 수 있습니다:
loading...
부분 링크 텍스트
표시되는 텍스트가 검색 값과 부분적으로 일치하는 앵커 요소를 찾으려면,
쿼리 문자열 앞에 *=를 사용하여 쿼리하세요(예: *=driver).
위 예제의 요소를 다음과 같이 호출하여 쿼리할 수도 있습니다:
loading...
참고: 하나의 선택자에서 여러 선택자 전략을 혼합할 수 없습니다. 대신 동일한 목표에 도달하기 위해 여러 개의 연결된 요소 쿼리를 사용하세요:
const elem = await $('header h1*=Welcome') // 작동하지 않습니다!!!
// 대신 다음을 사용하세요
const elem = await $('header').$('*=driver')
특정 텍스트가 있는 요소
동일한 기술을 요소에도 적용할 수 있습니다. 또한 쿼리 내에서 .= 또는 .*=를 사용하여 대소문자를 구분하지 않는 일치를 수행할 수도 있습니다.
예를 들어, "Welcome to my Page" 텍스트가 있는 레벨 1 제목을 쿼리하는 방법은 다음과 같습니다:
loading...
다음과 같이 호출하여 이 요소를 쿼리할 수 있습니다:
loading...
또는 부분 텍스트를 쿼리하여:
loading...
id와 class 이름에도 동일하게 작동합니다:
loading...
다음과 같이 호출하여 이 요소를 쿼리할 수 있습니다:
loading...
참고: 하나의 선택자에서 여러 선택자 전략을 혼합할 수 없습니다. 대신 동일한 목표에 도달하기 위해 여러 개의 연결된 요소 쿼리를 사용하세요:
const elem = await $('header h1*=Welcome') // 작동하지 않습니다!!!
// 대신 다음을 사용하세요
const elem = await $('header').$('h1*=Welcome')
태그 이름
특정 태그 이름을 가진 요소를 쿼리하려면 <tag> 또는 <tag />를 사용하세요.
loading...
다음과 같이 호출하여 이 요소를 쿼리할 수 있습니다:
loading...
Name 속성
특정 name 속성을 가진 요소를 쿼리하기 위해 일반 CSS3 선택자를 사용하거나, [name="some-name"]과 같은 선택자 파라미터를 전달하여 JSONWireProtocol에서 제공하는 name 전략을 사용할 수 있습니다:
loading...
loading...
참고: 이 선택자 전략은 더 이상 사용되지 않으며 JSONWireProtocol 프로토콜로 실행되는 오래된 브라우저나 Appium을 사용할 때만 작동합니다.
xPath
특정 xPath를 통해 요소를 쿼리하는 것도 가능합니다.
xPath 선택자는 //body/div[6]/div[1]/span[1]와 같은 형식을 가집니다.
loading...
다음과 같이 호출하여 두 번째 단락을 쿼리할 수 있습니다:
loading...
xPath를 사용하여 DOM 트리 위아래로 탐색할 수도 있습니다:
loading...