Selenium ChromeDriver:找不到我知道存在的网络元素

Selenium ChromeDriver: Cannot find web element I know exists

使用 python 和 Selenium,我无法抓取在 this 网站上找到的任何 JavaScript 插入数据。我已经在其他网站上用动态生成的内容测试了我的代码,它似乎工作正常,所以想知道这是否是 JS 在这个网站上生成的某种特定方式?

我想了解该商品在网站上的库存情况。下面的代码生成以下异常:selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//div[@id="theList"]/article[1]//div[@class="order"]/div/text()"} 但我知道这个 xpath 在 chrome 开发工具中尝试它是有效的。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import TimeoutException

service = Service(ChromeDriverManager().install())
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(service=service, options=options)
driver.get('https://www.deejay.de/velvet+velour')
elem = driver.find_element(
    By.XPATH, '//div[@id="theList"]/article[1]//div[@class="order"]/div[1]')
print(elem.text)

阅读相关的 SO 帖子我认为可能是我需要手动告诉驱动程序等待页面加载,所以我尝试了这个:

service = Service(ChromeDriverManager().install())
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(service=service, options=options)
driver.get('https://www.deejay.de/velvet+velour')
try:
    elem = WebDriverWait(driver=driver, timeout=20).until(
        lambda x: x.find_element(By.XPATH, '//div[@id="theList"]/article[1]//div[@class="order"]/div[1]'))
    print(elem.text)
except TimeoutException:
    print('took too long')

但是总是超时,returns我的异常信息。

知道为什么这可能不起作用吗?正如我所说,由于某种原因,我可以从其他网站获取 JS 生成的代码,但不能从 deejay.de

您需要先切换到 iframe。

iframe = WebDriverWait(driver, 30).until(EC.presence_of_element_located(
        (By.XPATH, "//iframe[@id='myIframe']")))
driver.switch_to.frame(iframe)

然后找到所有商品并像这样打印它们的库存情况

items = driver.find_elements(By.XPATH, "//div[@class='order']/div[1]")
for item in items:
    print(item.text)

最终切换回默认内容以访问 iframe 之外的元素

driver.switch_to.default_content()

注意:您需要导入以下内容

from selenium.webdriver.support import expected_conditions as EC