首页 > 解决方案 > Selenium Webdriver (Python) - 无法在嵌套 iframe 中定位元素

问题描述

我正在尝试从网页中的 iframe 中抓取一些数据。该网页的 URL 是https://www.nissanoflithiasprings.com/schedule-service。我正在尝试访问下图中显示的按钮:

在此处输入图像描述

当我右键单击按钮(位于 iframe 内)查看源代码时,我能够看到 HTML id 和名称(见下面的截图):

在此处输入图像描述

按钮的“id”是“new_customer_button”。但是,当我使用 selenium webdriverdriver.find_element_by_id("new_customer_button")访问按钮时,代码无法在 iframe 中找到按钮并引发以下错误:

NoSuchElementException: no such element: Unable to locate element: {"method":"id","selector":"new_customer_button"}

以下是我到目前为止尝试过的代码:

from selenium import webdriver
chrome_path = r"C:\Users\gh455\Downloads\chromedriver_win32\chromedriver.exe"
driver = webdriver.Chrome(chrome_path)
driver.get("https://www.nissanoflithiasprings.com/schedule-service")

dest_iframe = driver.find_elements_by_tag_name('iframe')[0] 
driver.switch_to.frame(dest_iframe)

driver.find_element_by_id("new_customer_button")

不知道为什么会这样。任何帮助将不胜感激。谢谢!

标签: pythonseleniumselenium-webdriveriframecss-selectors

解决方案


元素在多个<iframe>标签内,需要一一切换。您还应该最大化窗口并使用显式等待,因为它需要一些时间来加载

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

chrome_path = r"C:\Users\gh455\Downloads\chromedriver_win32\chromedriver.exe"
driver = webdriver.Chrome(chrome_path)
driver.maximize_window()
driver.get("https://www.nissanoflithiasprings.com/schedule-service")

wait = WebDriverWait(driver, 10)

# first frame - by css selector
wait.until(ec.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, '[src^="https://consumer.xtime.com"]')))

# second frame - by ID
wait.until(ec.frame_to_be_available_and_switch_to_it('xt01'))

driver.find_element_by_id("new_customer_button")

推荐阅读