[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('~~')
μ€λ₯, μλͺ»λ μ λλ κΆκΈν μ μ΄ μμΌμλ€λ©΄ λκΈ λ¨κ²¨μ£ΌμΈμβ