【问题标题】:How to automate/access nested shadow DOM elements using selenium python?如何使用 selenium python 自动化/访问嵌套的影子 DOM 元素?
【发布时间】:2022-12-12 08:12:45
【问题描述】:

我想访问/自动化嵌套影子 DOM 的元素。 Ley 对给定的链接说 https://books-pwakit.appspot.com/ 我想通过发送一些书名来搜索一些书。我正在根据我学到的知识尝试这样做,但它没有定位元素。我的代码是这样的...

url = "https://books-pwakit.appspot.com/"
driver.get(url)

shadow_host1 = driver.find_element(By.CSS_SELECTOR, "book-app[apptitle='BOOKS']")
shadow_root1 = driver.execute_script('return arguments[0].shadowRoot', shadow_host1)

shadow_host2 = driver.find_element(By.CSS_SELECTOR, "app-header[effects='waterfall']")
shadow_root2 = driver.execute_script('return arguments[0].shadowRoot', shadow_host2)

shadow_host3 = driver.find_element(By.CSS_SELECTOR, '.toolbar-top')
shadow_root3 = driver.execute_script('return arguments[0].shadowRoot', shadow_host3)

shadow_host4 = driver.find_element(By.CSS_SELECTOR, '.toolbar-bottom')
shadow_root4 = driver.execute_script('return arguments[0].shadowRoot', shadow_host4)

shadow_host5 = driver.find_element(By.CSS_SELECTOR, 'book-input-decorator')
shadow_root5 = driver.execute_script('return arguments[0].shadowRoot', shadow_host5)

shadow_content = shadow_root5.find_element(By.CSS_SELECTOR, '#input')

shadow_content.send_keys("Twilight")   

任何人都可以帮助我并描述我为什么会收到该错误。

【问题讨论】:

    标签: python-3.x selenium selenium-webdriver ui-automation shadow-dom


    【解决方案1】:

    为了获得内部 shadow_hosts,您需要在外部 shadow_host 元素上应用 find_element() 方法,而不是在全局 driver 对象上。
    以下代码有效:

    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
    options = Options()
    options.add_argument("start-maximized")
    
    webdriver_service = Service('C:webdriverschromedriver.exe')
    driver = webdriver.Chrome(options=options, service=webdriver_service)
    wait = WebDriverWait(driver, 30)
    
    url = "https://books-pwakit.appspot.com/"
    driver.get(url)
    
    shadow_host1 = driver.find_element(By.CSS_SELECTOR, "book-app[apptitle='BOOKS']")
    shadow_root1 = driver.execute_script('return arguments[0].shadowRoot', shadow_host1)
    
    shadow_host2 = shadow_root1.find_element(By.CSS_SELECTOR, "app-header[effects='waterfall']")
    shadow_root2 = driver.execute_script('return arguments[0].shadowRoot', shadow_host2)
    
    shadow_host3 = shadow_root1.find_element(By.CSS_SELECTOR, '.toolbar-top')
    shadow_root3 = driver.execute_script('return arguments[0].shadowRoot', shadow_host3)
    
    shadow_host4 = shadow_root1.find_element(By.CSS_SELECTOR, '.toolbar-bottom')
    shadow_root4 = driver.execute_script('return arguments[0].shadowRoot', shadow_host4)
    
    shadow_host5 = shadow_root1.find_element(By.CSS_SELECTOR, 'book-input-decorator')
    shadow_root5 = driver.execute_script('return arguments[0].shadowRoot', shadow_host5)
    
    shadow_content = shadow_host5.find_element(By.CSS_SELECTOR, '#input')
    shadow_content.send_keys("Twilight")
    

    这是结果:

    【讨论】:

      猜你喜欢
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      • 2020-01-14
      • 2019-08-07
      • 2013-01-12
      • 2023-03-11
      相关资源
      最近更新 更多