[Python] Shadow DOM ํฌ๋กค๋ง - Selenium
Selenium No Such Element ์๋ฌ
์ต๊ทผ Selenium์ ์ฌ์ฉํ์ฌ ํฌ๋กค๋ฌ๋ฅผ ๊ตฌ์ถํ ์ผ์ด ์๊ฒจ ํ์์ ๊ฐ์ด Xpath, Selector ๋ฑ์ ์ฌ์ฉํ์ฌ ๊ตฌ์ถ์ ์๋ํ์๋ค.
ํ์ง๋ง, Selenium ์ฌ์ฉ ์ ๊ฐ์ฅ ํํ ์๋ฌ์ธ selenium.common.exceptions.NoSuchElementException: Message:no such element:Unable to locate element:{"method":"css selector", "selector':"์ค์ ์ฌ์ฉํ ๊ตฌ๋ฌธ" ์๋ฌ๊ฐ ๋ฐ์ํ์ฌ ๋ชจ๋ ๋ฐฉ๋ฒ์ ๋์ํด ์์ ํ์์ผ๋ ์ค๋ฅ๋ ํด๊ฒฐ๋์ง ์์๋ค.
ํด๋น ์๋ฌ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์๋ ํด๋์ค ๋ช ์ ๊ณต๋ฐฑ์ด ์กด์ฌํ์ฌ ๊ณต๋ฐฑ ๋์ ์ ์ (.)์ ์ฌ์ฉํ์ฌ ํด๊ฒฐ, ๋ก๋ฉ ์๊ฐ์ผ๋ก ์ธํ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ์๊ฐ ์ง์ฐ ์ฝ๋ ์ถ๊ฐ, ๋์ผํ ํด๋์ค ๋ช ๋ฑ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์กด์ฌํ์ง๋ง ๋ชจ๋ ๋ฐฉ๋ฒ์ด ํตํ์ง ์์๋ค.
(ํด๋น ์๋ฌ ํด๊ฒฐ ๋ฐฉ์์ ํด๋น ํฌ์คํ ๊ธ์ ์ฐธ๊ณ ํ์๋ค.)
https://zeuskwon-ds.tistory.com/67
[selenium] ํฌ๋กค๋ง no such element ์ค๋ฅ ํด๊ฒฐ
์ ๋ ๋์ ์๋ฌ ํฌ๋กค๋ง์ ํ๋ฉด์ element์ ์ ๊ทผํ๋ ์ฝ๋ ์คํ์ ๊ฐ์ฅ ๋ง์ด ๋ง๋๋ ์๋ฌ๋ no such element์ผ ๊ฒ์ด๋ค. ๋ด๊ฐ ์ง์ ํ element(css_selector = rogA2c)์ ๊ฐ์ ๋ชป์ฐพ์ ๊ฒฝ์ฐ ๋ฐํํ๋ ์๋ฌ์ด๋ค. ๋ด๊ฐ
zeuskwon-ds.tistory.com
Shadow DOM
๋ชจ๋ ๋ฐฉ๋ฒ์ ๋์ํ์์ผ๋ ํด๊ฒฐ๋์ง ์์ ํฌ๋กค๋ง ๋์ ์ฌ์ดํธ์ ์ฝ๋๋ฅผ ์ ์ฌํ ๋ณด๋ ์ค ๋ค์๊ณผ ๊ฐ์ด #shadow-root ๋ฌธ์์ด์ด ์ฌ๋ฌ ๊ฐ ์กด์ฌํ๋ ๊ฒ์ ๋ฐ๊ฒฌํ์๋ค.
ํด๋น ์ฝ๋๋ฅผ ๊ตฌ๊ธ๋งํ ๊ฒฐ๊ณผ Shadow DOM ์์๊ฐ ์ ์ฉ๋ ๊ฒ์ ์ ์ ์์๋ค.
์ผ๋ฐ์ ์ผ๋ก HTML ์ฝ๋๋ฅผ ์ดํด๋ณด์์ ๋ #document, #shadow-root ๋ฌธ์์ด์ด ์กด์ฌํ๊ณ ํ๋จ์ ๋ HTML ์ฝ๋๊ฐ ์กด์ฌํ ๋ Shadow DOM ์์๊ฐ ์ ์ฉ๋์ด ์๋ค๊ณ ํ๋จํ ์ ์๋ค.
Shadow DOM์ด๋?
HTML ๊ฐ๋ฐ ์ ์ฝ๋๊ฐ ๋ณต์กํด์ง๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์จ๊ฒจ๋์ HTML ์์์ด๋ค.
์ผ๋ฐ ์ฌ์ฉ์๊ฐ ๋ณผ ์ ์์ผ๋ฉฐ F1ํค๋ฅผ ๋๋ฅธ ํ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ ํํ๋ฉด ์จ๊ฒจ์ง DOM ์์๊น์ง ๋ณผ ์ ์๋ ์ต์ ์ ์ฒดํฌํ ๊ฒฝ์ฐ์๋ ๋ชจ๋ ๋ณผ ์ ์๋ค.
Shadow DOM ์์๊ฐ ์ ์ฉ๋์์ ๋ ์์๊ฐ ์จ๊ฒจ์ง ์ํ์ด๋ฏ๋ก ํฌ๋กค๋ง์ ์๋ํ๋ฉด ์ํ๋ element๋ฅผ ์ฐพ์ง ๋ชปํ์ฌ No such element ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด์๋ค.
Shadow DOM ํฌ๋กค๋ง ๋ฐฉ๋ฒ
Selenium์์๋ ํ์ฌ Shadow DOM์ ๋ํ ๊ธฐ๋ฅ์ ์ง์ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ผ๋ pyshadow๋ผ๋ ํ๋ฌ๊ทธ์ธ์ด ์กด์ฌํ๋ค.
https://pypi.org/project/pyshadow/
pyshadow
Selenium plugin to manage shadow DOM elements on web page.
pypi.org
ํด๋น ํ๋ฌ๊ทธ ์ธ์ ์ฌ์ฉํ ๊ฒฝ์ฐ Shadow DOM ์์์ ๋ํ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ฉฐ ์ค์น๋ ์ผ๋ฐ ๋ชจ๋๊ณผ ๋์ผํ๊ฒ ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ ์ด๋ก ์ค์นํ๋ค.
pip install pyshadow
pyshadow์ import๋ ๋ค์๊ณผ ๊ฐ์ด ํ๋ค.
from pyshadow.main import Shadow
์ดํ ์ค์ ์ฝ๋์์๋ driver.get('์ํ๋ URL) ์ฝ๋ ์ดํ Shadow ๊ฐ์ฒด๋ฅผ ์ ์ธํ๊ณ ๊ธฐ์กด ์ฌ์ฉ ๋ฐฉ์๊ณผ ๋์ผํ๊ฒ find_element()๋ฅผ ์ฌ์ฉํ๋ฉด ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ํฌ๋กค๋ง ํ ์ ์๋ค. ์ผ๋ถ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
driver.get('ํฌ๋กค๋ง ๋์ URL')
shadow = Shadow(driver) # Shadow ๊ฐ์ฒด ์ ์ธ
temp = shadow.find_element('~~')
์ค๋ฅ, ์๋ชป๋ ์ ๋๋ ๊ถ๊ธํ ์ ์ด ์์ผ์๋ค๋ฉด ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์โ