๊ฐœ๋ฐœ๐Ÿ’ป/Python

[Python] Shadow DOM ํฌ๋กค๋ง - Selenium

ๅฃ“ๅ€’ 2022. 11. 1. 03:34

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 ๋ฌธ์ž์—ด์ด ์—ฌ๋Ÿฌ ๊ฐœ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•˜์˜€๋‹ค.

#Shados-root

 

ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๊ตฌ๊ธ€๋งํ•œ ๊ฒฐ๊ณผ Shadow DOM ์š”์†Œ๊ฐ€ ์ ์šฉ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

์ผ๋ฐ˜์ ์œผ๋กœ HTML ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์•˜์„ ๋•Œ #document, #shadow-root ๋ฌธ์ž์—ด์ด ์กด์žฌํ•˜๊ณ  ํ•˜๋‹จ์— ๋˜ HTML ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•  ๋•Œ Shadow DOM ์š”์†Œ๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Shadow DOM์ด๋ž€?

HTML ๊ฐœ๋ฐœ ์‹œ ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ˆจ๊ฒจ๋†“์€ HTML ์š”์†Œ์ด๋‹ค.

์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ์ˆ˜ ์—†์œผ๋ฉฐ F1ํ‚ค๋ฅผ ๋ˆ„๋ฅธ ํ›„ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋ฉด ์ˆจ๊ฒจ์ง„ DOM ์š”์†Œ๊นŒ์ง€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์„ ์ฒดํฌํ•  ๊ฒฝ์šฐ์—๋Š” ๋ชจ๋‘ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Show user agent shadow 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('~~')

 

 

 

์˜ค๋ฅ˜, ์ž˜๋ชป๋œ ์  ๋˜๋Š” ๊ถ๊ธˆํ•œ ์ ์ด ์žˆ์œผ์‹œ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋‚จ๊ฒจ์ฃผ์„ธ์š”โ—