CSS에서 가장 기본적이면서도 중요한 개념 중 하나가 Selector(선택자) 입니다.
이번 글에서는 CSS Selector가 무엇인지, 전체 CSS 문법에서 어떤 위치를 차지하는지, 그리고 Puppeteer 같은 자동화 환경에서 어떻게 활용되는지까지 정리해보겠습니다.
CSS 문법은 크게 두 가지로 나눌 수 있습니다:
즉, CSS 문법 전체 = Selector + Declarations
#box {
color: red;
font-size: 16px;
}
위 코드에서
#box → Selector{ color: red; font-size: 16px; } → Declarations
- Selector 예시: #box, .red, div, [attr=value]
- Declarations 예시: color: red;, font-size: 16px;
👉 즉, CSS Selector는 HTML 태그/속성을 전부 의미하는 게 아니라, 그중 “요소를 선택하는 규칙”만 담당하는 문법입니다.
div → 모든 <div> 요소.red → class="red" 요소#box → id="box" 요소div, p, span → 여러 요소 동시 선택* → 모든 요소 선택div p → div 안의 모든 p (후손 선택자)div > p → div 바로 아래 자식 pdiv + p → div 바로 뒤 형제 pdiv ~ p → div 뒤에 오는 모든 형제 p[type="text"] → type="text" 인 요소[href^="https"] → href가 https로 시작[href$=".pdf"] → href가 .pdf로 끝남[data-role*="admin"] → data-role 속성에 "admin" 포함:hover → 마우스 오버:first-child → 첫 번째 자식:nth-child(2) → 두 번째 자식:not(.active) → active 클래스가 아닌 요소p::before → <p> 앞에 생성되는 가상 요소p::after → <p> 뒤에 생성되는 가상 요소p::first-line → <p>의 첫 번째 줄Puppeteer는 CSS Selector를 그대로 사용할 수 있으며, 몇 가지 확장 문법도 지원합니다.
await page.locator('#submit-button').click(); // id="submit-button"
await page.locator('.username-input').fill('민규'); // class="username-input"
await page.click('input[type="checkbox"]');
await page.type('input[name="email"]', 'test@example.com');
await page.click('form > button'); // form 바로 아래 있는 button
await page.click('.menu li:first-child'); // 메뉴의 첫 번째 항목
// "로그인" 텍스트 포함된 요소 // 또는 레거시 문법
await page.locator('::-p-text(로그인)').click();
await page.locator('text/로그인').click();
await page.click('css:shadow=#my-element >>> button');
// shadow-root 내부 버튼 클릭
// 필터링을 통한 정확한 요소 선택
await page.locator('button')
.filter(button => button.innerText === '확인')
.click();
// 여러 요소 중 특정 순서 선택
await page.locator('.item').nth(2).click(); // 세 번째 item
// 요소가 나타날 때까지 대기
await page.locator('.loading-spinner').wait();
// ARIA 레이블로 접근성 친화적 선택
await page.locator('::-p-aria(Submit)').click();
💡 loacator 장점
- 요소가 준비될 때까지 자동 대기
- 뷰포트 확인, 활성화 상태 확인 등 자동 검증
- 재시도 메커니즘으로 더 안정적인 테스트 가능
- CSS 문법 전체 = Selector + Declarations
- CSS Selector = HTML 요소를 선택하는 규칙
- Puppeteer는 CSS Selector를 그대로 지원하며, text/, css:shadow 같은 확장 문법도 제공