크롤링을 하면서
아무리 해도 그런 element를 찾지 못한다는 에러가 나왔다.
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element
자세히 보니 shadow-root (closed) 라는게 적혀있었다.
보자마자 뭔지는 자세히 모르겠지만 얘가 에러의 원인임을 알 수 있었다.
그래서 Shadow-root 가 뭐야?
Shadow-root는 shadow DOM 트리의 Root 노드 이다.
Shadow DOM은 뭔데?
말 그대로 '숨겨진 DOM 트리'로 원하는 모든 element 안에 추가할 수 있다.
예를 들면, <video> tag를 사용할 때 DOM에서 보여지는 것은 단순히 <video> tag이지만 UI를 살펴보면 재생 버튼, 일시정지 버튼, progress bar 등 다양한 element가 있는데 이런 게 shadow DOM 내부에 포함되어 있다고 보면 된다!
※ Flattened Tree : 렌더링을 위해 평평해진 트리
Shadow host : shadow DOM이 추가되는 일반 DOM의 노드. 즉, shadow root의 부모
Shadow tree : shadow DOM 내부의 DOM 트리
Shadow boundary : shadow DOM이 끝나고, 일반 DOM이 시작되는 장소
왜 사용하는데?
Shadow DOM은 element, style 등을 숨겨서 캡슐화를 할 수 있고,
다른 element class, id 와 겹치지 않도록 코드를 깨끗하게 유지할 수 있다.
즉, shadow DOM을 사용하면 기존 DOM에서 분리되어
글로벌한 style이 적용되지 않는, 별도의 style을 적용할 수 있는 scope를 가질 수 있다!
shadow dom 생성 방법
attachShadow를 사용하여 shadow root를 생성할 수 있다.
여기서 mode는 open, closed를 작성할 수 있는데,
- open : Javascript를 사용하여 외부에서 shadow DOM에 접근 가능
- closed : 접근 불가능 (null 반환)
// shadow root 생성
let shadow = elementRef.attachShadow({mode: 'open'});
let shadow = elementRef.attachShadow({mode: 'closed'});
// p element를 shadow dom에 추가
let para = document.createElement('p');
shadow.appendChild(para);
https://developer.mozilla.org/en-US/docs/Web/API/Element/attachShadow
그래서 결론은,
shadow-root (closed) 였기 때문에 크롤링을 할 수 없었다..🥲
'💻 개발IT > 기타' 카테고리의 다른 글
[Word2Vec] 단어 유사도 구현하기 (1) | 2023.02.01 |
---|---|
[Gensim] The vocab attribute was removed from KeyedVector in Gensim 4.0.0. (0) | 2023.01.29 |
[selenium] ElementClickInterceptedException: Message: element click intercepted: (0) | 2022.09.26 |
네이버 지도 API에서 지도 겹침 문제 (0) | 2022.09.22 |
[HTML/CSS] cell sticky table 생성 (0) | 2022.09.14 |
[nvm] Error: Permission denied @ apply2files - /usr/local/lib/node_modules/expo-cli/node_modules/.bin/detect-libc (0) | 2022.09.13 |
OpenAPI Generator 사용법 (0) | 2022.09.08 |
[CSS] content 속성 (0) | 2022.09.07 |