【问题标题】: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")
这是结果: