Dev.Op
Yollow ๐Ÿ“š
Dev.Op
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (701)
    • ์œ ์ตํ•˜์…จ๋‹ค๋ฉด ๊ด‘๊ณ  ํ•œ๋ฒˆ๋งŒ ํด๋ฆญ ๋ถ€ํƒ๋“œ๋ฆด๊ฒŒ์š”~ (0)
    • ---------------------------.. (0)
    • Stock (1)
      • ์Šˆํผ๋งˆ์ดํฌ๋กœ์ปดํ“จํ„ฐ (2)
    • ๐Ÿง์ „๊ธฐ์ฐจ (72)
      • ๐Ÿ„lg์—๋„ˆ์ง€์†”๋ฃจ์…˜ (0)
      • ๐ŸŠํ˜„๋Œ€์ž๋™์ฐจ (0)
    • ๐Ÿ—๏ธ์†Œํ”„ํŠธ์›จ์–ด (243)
      • ๐Ÿ’ปpython (85)
      • โž•C & C++ (1)
      • โ˜•๏ธTableau (32)
      • ๐Ÿ‘‹SQL & MySQL (20)
      • ๐ŸฌHTML & CSS (14)
      • ๐Ÿ“—JavaScript (31)
      • ๐Ÿ“˜Pspice & Excel (2)
      • ๐Ÿ“•Matlab & COMSOL & CATIA (6)
      • ๐Ÿ“™java & Servlete & JSP (29)
      • ๐Ÿ““Raspberry PI 4 (5)
      • ๐Ÿ”จAnsys (2)
      • DJango (0)
      • Flutter (3)
      • Typescript (0)
      • ๐Ÿ†Vue (5)
      • ๐Ÿ‹Docker (1)
    • ๐Ÿ“‹์ฑ„์šฉ๊ณต๊ณ  (0)
    • ๐Ÿ“WEB & ML & DL ํ”„๋กœ์ ํŠธ (27)
      • ๐ŸŒต2์ฐจ ํ”„๋กœ์ ํŠธ(LG) (9)
    • ๐Ÿงฉ์ผ์ƒ (89)
      • ๐ŸŒค์ฝ”๋”ฉ ๊ณต๋ถ€ ์ผ์ง€ (1)
      • ๐Ÿšด์ž์ „๊ฑฐ (5)
      • ๐Ÿ“ฐํ…Œํฌ (20)
      • ๐ŸฆFood & Cafe (5)
      • ๐Ÿ’‰์˜์–ด ๋„์ ์ด๊ธฐ (5)
      • โšก๋ฐœ์ „์†Œ (6)
      • ๐Ÿ“š๋…์„œ (1)
      • ๐Ÿ›ซ์—ฌํ–‰ (2)
      • ๐Ÿ“ˆ๋ธ”๋กœ๊ทธ๋งˆ์ผ€ํŒ… (6)
    • ๐ŸŒ๊ธˆ์œต (37)
    • ๐ŸŽจ์ทจ์—…End (16)
    • ๐Ÿ‘‹์ž๊ฒฉ์ฆ (150)
      • ๐Ÿ™ˆSQLD๊ฐœ๋ฐœ์ž (12)
      • ๐Ÿ”Œ์ „๊ธฐ๊ธฐ์‚ฌ (116)
      • ๐Ÿข์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ (7)
      • ๐ŸŒŽADsP(๋ฐ์ดํ„ฐ๋ถ„์„์ค€์ „๋ฌธ๊ฐ€) (10)
      • ๐Ÿš™1์ข… ๋Œ€ํ˜• ์šด์ „ ๋ฉดํ—ˆ (1)
      • โญTableau Desktop Specialist (2)
    • ๐Ÿฅ‡๊ณต๋Œ€์ด๊ฑฐ์ €๊ฒƒ(๋ง‰ํ•™๊ธฐ) (24)
      • ๐Ÿ“๊ณตํ•™์ˆ˜ํ•™ 2 (1)
      • ๐Ÿบ๋งˆ์ดํฌ๋กœํ”„๋กœ์„ธ์„œ์‹ค์Šต (4)
      • ๐ŸŒCAE (10)
      • โœˆ๏ธ์ž๋™์ฐจ๊ณตํ•™์‹คํ—˜2 (0)
      • ๐Ÿšข์œ ์ฒด์—ญํ•™ (6)
      • ๐Ÿš—ํ˜„๋Œ€์ฐจ H-๋ชจ๋นŒ๋ฆฌํ‹ฐ ํด๋ž˜์Šค 1๊ธฐ (3)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    ๊ณต์ง€์‚ฌํ•ญ

    • Vue, Typescript, React, Tableau,โ‹ฏ
    • ์ง„์ธ์‚ฌ๋Œ€์ฒœ๋ช…(็›กไบบไบ‹ๅพ…ๅคฉๅ‘ฝ)

    ์ธ๊ธฐ ๊ธ€

    ํƒœ๊ทธ

    • LG์—๋„ˆ์ง€์†”๋ฃจ์…˜
    • ์•„์ด์˜ค๋‹‰5
    • ipad dual monitor
    • Python
    • ์ „๊ธฐ์ฐจ
    • ๋น…๋ฐ์ดํ„ฐ
    • ์ž๋ฐ”
    • ์—…๋น„ํŠธ
    • ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • fluid mechanics
    • ์—”์†”
    • ์—”๋น„๋””์•„
    • ๋น…๋ฐ์ดํ„ฐ๋ถ„์„์ค€์ „๋ฌธ๊ฐ€
    • ์ง๋ ฌ๋ฆฌ์•กํ„ฐ
    • html
    • lgํ™”ํ•™
    • ์œ ์ฒด์—ญํ•™
    • ๋ถ€๋“ฑ๋ฅ 
    • ๋ฐฑ์ค€
    • ํ…Œ์Šฌ๋ผ
    • ๋””์นด๋ฅด๊ณ 
    • ๋ธŒ๋ฃจํŠธํฌ์Šค
    • ADsP
    • vue btn
    • SMCI
    • ์ „๊ธฐ์ฐจ ๋ณด์กฐ๊ธˆ 2021
    • rdfr
    • ์—๋””์Šจev
    • ์‚ผ์„ฑ์ „์ž
    • css

    ์ตœ๊ทผ ๋Œ“๊ธ€

    ์ตœ๊ทผ ๊ธ€

    ํ‹ฐ์Šคํ† ๋ฆฌ

    hELLO ยท Designed By ์ •์ƒ์šฐ.
    Dev.Op

    Yollow ๐Ÿ“š

    ๐Ÿ—๏ธ์†Œํ”„ํŠธ์›จ์–ด/๐Ÿ’ปpython

    ํฌ๋กค๋ง ์…€๋ ˆ๋Š„ ๊ธฐ๋Šฅ๋“ค - ํฌ๋กค๋Ÿฌ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

    2021. 11. 26. 05:47
    ๋ฐ˜์‘ํ˜•

    Selenium Intro

    ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ปจํŠธ๋กค์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์คŒ

    Python ๊ฐ™์€ ๊ฒฝ์šฐ, 3.5 ์ด์ƒ๋ถ€ํ„ฐ ์ง€์›๋˜๋ฉฐ 3.6 ์ด์ƒ ๋ฒ„์ „ ๋ถ€ํ„ฐ pip ๋กœ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

     

    ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ธŒ๋ผ์šฐ์ €๋Š” ํ•˜๋‹จ์— ๋ฆฌ์ŠคํŠธ์—…

    ์„ค์น˜ ์ฝ”๋“œ

    pip install selenium

    Driver ๋‹ค์šด๋กœ๋“œ ๋งํฌ , ํฌ๋กฌ,์—ฃ์ง€,ํŒŒ์ด์–ดํญ์Šค, ์‚ฌํŒŒ๋ฆฌ

    Chrome https://sites.google.com/a/chromium.org/chromedriver/downloads
    Edge https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
    Firefox https://github.com/mozilla/geckodriver/releases
    Safari https://webkit.org/blog/6900/webdriver-support-in-safari-10/

    ๋ธŒ๋ผ์šฐ์ € ์—ด๊ธฐ (chrome)

    from selenium import webdriver
    
    driver = webdriver.Chrome('chromedriver.exe')

    ๊ถŒ์žฅ ๋ธŒ๋ผ์šฐ์ € ์—ด๊ธฐ ์ฝ”๋“œ

    ๋ธŒ๋ผ์šฐ์ ธ ์—ด๊ธฐ ์˜ต์…˜ ๋„ฃ๊ธฐ

    ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ด ๋•Œ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์„ ์…€๋ ˆ๋‹ˆ์›€์—์„œ๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

    ์œˆ๋„์šฐ ์‚ฌ์ด์ฆˆ

    from selenium import webdriver
    
    options = webdriver.ChromeOptions()
    options.add_argument('window-size=1920,1080')
    
    driver = webdriver.Chrome('chromedriver.exe', options=options)

    Headless ( ์ฐฝ์„ ํ‚ค์ง€ ์•Š๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ, ์œ ํŠœ๋ธŒ ๊ฐ™์€ ๊ณณ์—์„œ ์ข‹์Œ)

    from selenium import webdriver
    
    options = webdriver.ChromeOptions()
    options.add_argument('headless')
    
    driver = webdriver.Chrome('chromedriver.exe', options=options)

    ์ฐฝ ์ตœ๋Œ€ํ™” maxmize

    from selenium import webdriver
    
    options = webdriver.ChromeOptions()
    options.add_argument('start-maximized)
    
    driver = webdriver.Chrome('chromedriver.exe', options=options)
    
    # ์ด ๋ฐฉ๋ฒ• ์ด์™ธ์—๋Š” ๋‹ค์Œ ๋ฐฉ๋ฒ•
    
    driver.maximize_window()

    ๋ธŒ๋ผ์šฐ์ € ๋‹ซ๊ธฐ Close

    driver.close() #ํ˜„์žฌ ํƒญ ๋‹ซ๊ธฐ
    driver.quit()  #๋ธŒ๋ผ์šฐ์ € ๋‹ซ๊ธฐ

    ๋’ค๋กœ๊ฐ€๊ธฐ Back / ์•ž์œผ๋กœ๊ฐ€๊ธฐ Front

    driver.back() #๋’ค๋กœ๊ฐ€๊ธฐ
    driver.forward() #์•ž์œผ๋กœ๊ฐ€๊ธฐ

    ํƒญ ์ด๋™ Tab Move

    driver.window_handles[0] #๋ธŒ๋ผ์šฐ์ € ํƒญ ๊ฐ์ฒด๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜. [0] ์€ ์ธ๋ฑ์‹ฑ. ์ฒซ๋ฒˆ์žฌ ํƒญ์„ ์˜๋ฏธ
    
    driver.switch_to.window(driver.window_handles[0]) #์ฒซ๋ฒˆ์งธ ํƒญ์œผ๋กœ ์ด๋™
    driver.switch_to.window(driver.window_handles[1]) #๋‘๋ฒˆ์งธ ํƒญ์œผ๋กœ ์ด๋™
    driver.switch_to.window(driver.window_handles[2]) #์„ธ๋ฒˆ์งธ ํƒญ์œผ๋กœ ์ด๋™

    ํƒญ ๋‹ซ๊ธฐ Tab close

    driver.switch_to.window(driver.window_handles[0]) #๋‹ซ์„ ํƒญ์œผ๋กœ ์ด๋™ ํ›„
    
    driver.close()

    ์—˜๋ ˆ๋จผํŠธ์— ๊ด€ํ•˜์—ฌ

    ์šฐ๋ฆฌ๋Š” ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ๋กœ๊ทธ์ธ๋„ ํ•˜๊ณ  ๋ฒ„ํŠผ๋„ ํด๋ฆญํ•˜๊ณ  ๊ฒ€์ƒ‰์ฐฝ์— ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ธŒ๋ผ์šฐ์ € ์ƒ์—์„œ ๋ณด์ด๋Š” ๋ฒ„ํŠผ, ๊ฒ€์ƒ‰์ฐฝ, ์‚ฌ์ง„, ํ…Œ์ด๋ธ”, ๋™์˜์ƒ ๋“ฑ๋“ฑ ์ด ๋ชจ๋“  ๊ฒƒ๋“ค์„ ์—˜๋ ˆ๋จผํŠธ(element, ์š”์†Œ) ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์…€๋ ˆ๋‹ˆ์›€์€ ์šฐ๋ฆฌ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํŠน์ • ์š”์†Œ๋ฅผ ํด๋ฆญํ•˜๊ณ  ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์‚ฌ์ง„๋“ฑ์„ ๋ฐ›์•„์˜ค๊ณ  ํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋“ฑ๋“ฑ ์–ด๋– ํ•œ ์œ„์น˜์— ์žˆ๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ถ€๋ฅผ ๋•Œ ์—˜๋ ˆ๋จผํŠธ๋ผ๋Š” ๊ฐœ๋…์œผ๋กœ ์ ‘๊ทผํ•œ๋‹ค. ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์—˜๋ ˆ๋จผํŠธ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ๋Œ€๋ถ€๋ถ„ xpath ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    ์—˜๋ ˆ๋จผํŠธ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•

    driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[1]/div/div[3]/form/fieldset/button/span[2]') #xpath ๋กœ ์ ‘๊ทผ
    driver.find_element_by_class_name('ico_search_submit')  #class ์†์„ฑ์œผ๋กœ ์ ‘๊ทผ
    driver.find_element_by_id('ke_kbd_btn') #id ์†์„ฑ์œผ๋กœ ์ ‘๊ทผ
    driver.find_element_by_link_text('ํšŒ์›๊ฐ€์ž…')    #๋งํฌ๊ฐ€ ๋‹ฌ๋ ค ์žˆ๋Š” ํ…์ŠคํŠธ๋กœ ์ ‘๊ทผ
    driver.find_element_by_css_selector('#account > div > a')   #css ์…€๋ ‰ํ„ฐ๋กœ ์ ‘๊ทผ
    driver.find_element_by_name('join') #name ์†์„ฑ์œผ๋กœ ์ ‘๊ทผ
    driver.find_element_by_partial_link_text('๊ฐ€์ž…')  #๋งํฌ๊ฐ€ ๋‹ฌ๋ ค ์žˆ๋Š” ์—˜๋ ˆ๋จผํŠธ์— ํ…์ŠคํŠธ ์ผ๋ถ€๋งŒ ์ ์–ด์„œ ํ•ด๋‹น ์—˜๋ ˆ๋จผํŠธ์— ์ ‘๊ทผ
    driver.find_element_by_tag_name('input')    #ํƒœ๊ทธ ์ด๋ฆ„์œผ๋กœ ์ ‘๊ทผ
    
    driver.find_element_by_tag_name('input').find_element_by_tag_name('a')  #input ํƒœ๊ทธ ํ•˜์œ„ํƒœ๊ทธ์ธ a ํƒœ๊ทธ์— ์ ‘๊ทผ
    driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[1]/div/div[3]/form/fieldset/button/span[2]').find_element_by_name('join') #xpath ๋กœ ์ ‘๊ทผํ•œ ์—˜๋ ˆ๋จผํŠธ์˜ ์•ˆ์— join ์ด๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ง„ tag ์—˜๋ ˆ๋จผํŠธ์— ์ ‘๊ทผ

    ์—˜๋ ˆ๋จผํŠธ ํด๋ฆญ

    driver.find_element_by_id('ke_kbd_btn').click()

    ํ…์ŠคํŠธ ์ž…๋ ฅ

    driver.find_element_by_id('ke_awd2_btn').send_keys('ํ…์ŠคํŠธ ์ž…๋ ฅ')

    ํ…์ŠคํŠธ ์‚ญ์ œ

    driver.find_element_by_id('ke_awd2_btn').clear()

    ๋‹จ์ถ•ํ‚ค ์ž…๋ ฅ

    from selenium.webdriver.common.keys import Keys
    
    # ์ปจํŠธ๋กค+V
    driver.find_element_by_id('ke_kbd_btn').send_keys(Keys.CONTROL + 'v')
    
    # ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•
    from selenium.webdriver import ActionChains
    
    ActionChains(driver).key_down(Keys.CONTROL).send_keys('V').key_up(Keys.CONTROL).perform() 
    #์œ„์—์„œ driver ๋Œ€์‹  ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ž…๋ ฅํ•ด๋„ ์ข‹์Œ. 

    Frame ์ด๋™

    #์ด๋™ํ•  ํ”„๋ ˆ์ž„ ์—˜๋ฆฌ๋จผํŠธ ์ง€์ •
    element = driver.find_element_by_tag_name('iframe')
    
    #ํ”„๋ ˆ์ž„ ์ด๋™
    driver.switch_to.frame(element)
    
    #ํ”„๋ ˆ์ž„์—์„œ ๋น ์ ธ๋‚˜์˜ค๊ธฐ
    driver.switch_to.default_content()

    ๊ฒฝ๊ณ ์ฐฝ (alert)

    ๊ฒฝ๊ณ ์ฐฝ์ด ๋–ด์„ ๋•Œ ์ˆ˜๋ฝ ๋˜๋Š” ๊ฑฐ์ ˆ์„ ๋ˆŒ๋Ÿฌ์ฃผ๊ฑฐ๋‚˜ ๊ฒฝ๊ณ ์ฐฝ์˜ ํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

    ๊ฒฝ๊ณ ์ฐฝ ์ด๋™

    #๊ฒฝ๊ณ ์ฐฝ์œผ๋กœ ์ด๋™
    driver.switch_to.alert

    ๊ฒฝ๊ณ ์ฐฝ ์ˆ˜๋ฝ / ๊ฑฐ์ ˆ

    from selenium.webdriver.common.alert import Alert
    
    Alert(driver).accept()    #๊ฒฝ๊ณ ์ฐฝ ์ˆ˜๋ฝ ๋ˆ„๋ฆ„
    Alert(driver).dismiss()   #๊ฒฝ๊ณ ์ฐฝ ๊ฑฐ์ ˆ ๋ˆ„๋ฆ„
    print(Alert(driver).text  # ๊ฒฝ๊ณ ์ฐฝ ํ…์ŠคํŠธ ์–ป์Œ

    ์ฟ ํ‚ค ๊ฐ’ ์–ป๊ธฐ

    #์ฟ ํ‚ค๊ฐ’ ์–ป๊ธฐ
    driver.get_cookies()
    
    #์ฟ ํ‚ค ์ถ”๊ฐ€
    driver.add_cookie()
    
    #์ฟ ํ‚ค ์ „๋ถ€ ์‚ญ์ œ
    driver.delete_all_cookies()
    
    #ํŠน์ • ์ฟ ๊ธฐ ์‚ญ์ œ
    driver.delete_cookie(cookiename)

    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ์‹คํ–‰

    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž์ฃผ ๊ทธ๋ฆฌ๊ณ  ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ช‡๊ฐœ๋ฅผ ์•Œ์•„๋ณธ๋‹ค.

    ์Šคํฌ๋กค ์ด๋™

    #๋ธŒ๋ผ์šฐ์ € ์Šคํฌ๋กค ์ตœํ•˜๋‹จ์œผ๋กœ ์ด๋™
    driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
    
    # CSS ์…€๋ ‰ํ„ฐ๋กœ ํด๋ฆญ
    driver.execute_script("document.querySelector('body >  div.modal-options__buttons > button.btn.btn-primary').click();")
    
    #๋˜๋Š”
    elemToclick = driver.~~~
    driver.execute_script('arguments[0].click();', elemToclick)
    
    # driver.find_element_by_css_selector(~~).click() ๊ณผ ๋™์ผํ•˜๋‚˜ ์ด ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์„์‹œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์‹œ๋„ํ•ด๋ณผ๋งŒํ•˜๋‹ค.
    
    # ์Šคํฌ๋กค ํŠน์ • ์—˜๋ฆฌ๋จผํŠธ๋กœ ์ด๋™
    element = driver.find_element_by_css_selector('div > a')
    driver.execute_script('arguments[0].scrollIntoView(true);', element)

    ์ƒˆ ํƒญ ์—ด๊ธฐ

    driver.execute_script('window.open("https://naver.com");')

    ์Šคํฌ๋ฆฐ์ƒท Screenshot

    #์บก์ณํ•  ์—˜๋ ˆ๋จผํŠธ ์ง€์ •
    element = driver.driver.find_element_by_class_name('ico.search_submit')
    #์บก์ณ
    element.save_screenshot('image.png')

    ๋’ค๋กœ  Back , ์•ž์œผ๋กœ Front

    # ๋’ค๋กœ๊ฐ€๊ธฐ
    driver.back()
    
    #์•ž์œผ๋กœ ๊ฐ€๊ธฐ
    driver.forward()

    ์˜ˆ์™ธ์ฒ˜๋ฆฌ / Exceptions

    from selenium.common.exceptions import NoAlertPresentException, NoSuchElementException, TimeoutException, ElementNotInteractableException,NoSuchWindowException, NoSuchFrameException
    
    # NoAlertPresentException ๊ฒฝ๊ณ ์ฐฝ ๊ด€๋ จ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ–ˆ์œผ๋‚˜ ํ˜„์žฌ ๊ฒฝ๊ณ ์ฐฝ์ด ๋œจ์ง€ ์•Š์Œ
    # NoSuchElementException ์—˜๋ ˆ๋จผํŠธ ์ ‘๊ทผํ•˜์˜€์œผ๋‚˜ ์—†์Œ
    # TimeoutException ํŠน์ •ํ•œ ์•ก์…˜์„ ์‹คํ–‰ํ•˜์˜€์œผ๋‚˜ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ์ง€๋‚˜๋„๋ก ์†Œ์‹์ด ์—†์Œ
    # ElementNotInteractableException ์—˜๋ฆฌ๋จผํŠธ์— ํด๋ฆญ๋“ฑ์„ ํ•˜์˜€์œผ๋‚˜ ํด๋ฆญํ•  ์„ฑ์งˆ์˜ ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ์•„๋‹˜
    # NoSuchWindowException ํ•ด๋‹น ์œˆ๋„์šฐ ์—†์Œ
    # NoSuchFrameException ํ•ด๋‹น ํ”„๋ ˆ์ž„ ์—†์Œ

    shadow DOM ์ฒ˜๋ฆฌ

    #shadow dom ์—˜๋ ˆ๋จผํŠธ ์—ด์–ด์ฃผ๋Š”๋ฒ•
    element = driver.execute_script("return document.querySelector('#syndi_powerpage > div').shadowRoot").get_attribute('innerHTML') # css Selector ์ด์šฉ # element ์˜ HTML ๋‚ด์šฉ return
    # shadow dom ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•œ ํฌ๋กฌ ์ธํ„ฐ๋„ท ๊ธฐ๋ก ์‚ญ์ œ
    
    def expand_shadow_element(element):
        shadow_root = driver.execute_script('return arguments[0].shadowRoot', element)
        return shadow_root
    
    driver.get('chrome://settings/clearBrowserData')
    
    elem = driver.find_element_by_css_selector('body > settings-ui')
    elem1 = expand_shadow_element(elem)
    elem1 = elem1.find_element_by_id('main')
    elem2 = expand_shadow_element(elem1)
    elem2 = elem2.find_element_by_tag_name('settings-basic-page')
    elem3 = expand_shadow_element(elem2)
    elem3 = elem3.find_element_by_tag_name('settings-privacy-page')
    elem4 = expand_shadow_element(elem3)
    elem4 = elem4.find_element_by_tag_name('settings-clear-browsing-data-dialog')
    elem5 = expand_shadow_element(elem4)
    elem5forconfirmelem = expand_shadow_element(elem4) # ์ธํ„ฐ๋„ท ์‚ฌ์šฉ๊ธฐ๋ก ์‚ญ์ œ๋ฒ„ํŠผ ํด๋ฆญ์„ ์œ„ํ•œ ์—˜๋ ˆ๋จผํŠธ ๋”ฐ๋กœ ๋นผ๋†“๊ธฐ
    elem5 = elem5.find_element_by_id('clearFromBasic')
    elem6 = expand_shadow_element(elem5)
    elem6 = elem6.find_element_by_id('dropdownMenu')
    elem6.find_element_by_css_selector('option[value="4"]').click() # ์ „์ฒด๊ธฐ๊ฐ„ ์„ ํƒ
    elem5forconfirmelem.find_element_by_id('clearBrowsingDataConfirm').click() # 
    ๋ฐ˜์‘ํ˜•
    ์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

    '๐Ÿ—๏ธ์†Œํ”„ํŠธ์›จ์–ด > ๐Ÿ’ปpython' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

    [python] os ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒฝ๋กœ ์„ค์ • - os.getcwd(), path  (0) 2021.11.26
    jupyter_notebook_config.json error ์—๋Ÿฌ ์›์ธ ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•  (0) 2021.11.26
    Only the following pseudo-classes are implemented: nth-of-type. ์—๋Ÿฌ(error)  (0) 2021.11.25
    ์œ ํŠœ๋ธŒ ์‚ฌ์ดํŠธ ํฌ๋กค๋ง(๋งํฌ, href)  (0) 2021.11.25
    'list' object has no attribute 'find_all' ์—๋Ÿฌ  (0) 2021.11.25
      '๐Ÿ—๏ธ์†Œํ”„ํŠธ์›จ์–ด/๐Ÿ’ปpython' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
      • [python] os ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒฝ๋กœ ์„ค์ • - os.getcwd(), path
      • jupyter_notebook_config.json error ์—๋Ÿฌ ์›์ธ ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
      • Only the following pseudo-classes are implemented: nth-of-type. ์—๋Ÿฌ(error)
      • ์œ ํŠœ๋ธŒ ์‚ฌ์ดํŠธ ํฌ๋กค๋ง(๋งํฌ, href)
      Dev.Op
      Dev.Op
      Interest: CS, Drive

      ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”