Selenium 未检测到元素,我无法切换到影子根内部结构

问题描述 投票:0回答:1

我正在尝试从网站上删除链接,但我似乎无法找到与产品相关的元素。

网站 = https://www.cvlinens.com/collections/table-linens?page=3

我的代码:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import pandas as pd

driver = webdriver.Chrome()
url = 'https://www.cvlinens.com/collections/table-linens?page=3'
driver.get(url)

  

try:
    load = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'products-grid')))
except:
    driver.close()
    print('failed')

它不断返回“失败”。我也尝试过通过 xpath 和 css 选择器查找元素,但没有成功。

我在某处读到过有关 iframe 的内容,以及我需要如何切换到包含该元素的 iframe 来访问它。但我无法切换到 iframe。它也返回“失败”。

python selenium-webdriver selenium-chromedriver
1个回答
0
投票

你的元素放置在shadow-root内部,要获取内部shadow root结构,你应该先获取它的主机,然后获取

shadowRoot
属性。

当前示例中的影子主机是 id 为

fast-simon-serp-app

的元素

get_shadow_root
函数使用JS执行器从主机获取影子根。

有关 Shadow DOM 的更多信息

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
timeout = 10
wait = WebDriverWait(driver, timeout)

def get_shadow_root(element):
    return driver.execute_script('return arguments[0].shadowRoot', element)

driver.get("https://www.cvlinens.com/collections/table-linens?page=3")
driver.maximize_window()

shadow_host = wait.until(EC.visibility_of_element_located((By.ID, "fast-simon-serp-app")))
shadow_container = get_shadow_root(shadow_host)
grid = shadow_container.find_element(By.ID, 'products-grid')
© www.soinside.com 2019 - 2024. All rights reserved.