如何使用 Selenium 和 Python 在嵌套的 iframe 中定位元素
How to locate an element within nested iframes using Selenium and Python
试图在页面底部找到 <nobr>
标记的 xpath,这让我发疯。框架使问题复杂化。有人可以告诉我这个的 xpath 吗?
我正在尝试编写一个 selenium 脚本并且我已经做到了:
EC.frame_to_be_available_and_switch_to_it, ((By.NAME, "main"))
之后 none 我的 xpath 尝试成功获取 <nobr>
标签中显示供应商的内容。
HTML:
另一种选择:
//nobr[.='Suppliers']/parent::span
对于框架集:
//frameset[@rows='48,*']
由于所需元素位于多个网状 <iframe>
中,因此要在元素上调用 click()
,您必须:
- 为曾祖父引入WebDriverWait
frame_to_be_available_and_switch_to_it()
.
- 为祖父引入WebDriverWait
frame_to_be_available_and_switch_to_it()
.
- 为parent引入WebDriverWait
frame_to_be_available_and_switch_to_it()
.
- 为所需的
element_to_be_clickable()
. 引入 WebDriverWait
您可以使用以下解决方案:
使用CSS_SELECTOR
:
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#main[name='main']")))
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[name='marketcenterHome']")))
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#main[name='TabNavigation']")))
element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span.tabSelText>nobr")))
使用XPATH
:
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='main' and @name='main']")))
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@name='marketcenterHome']")))
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@name='TabNavigation']")))
element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='tabSelText']/nobr[text()='Suppliers']")))
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
参考
您可以在以下位置找到一些相关讨论:
很抱歉延迟返回解决方案,但问题是我需要从标题 iframe 上升一个级别以使自己进入 root,然后我才能进入 main。
一个简单的问题,但当你当时对框架了解不多时,就不那么简单了。
我感谢所有花时间回答的人。
试图在页面底部找到 <nobr>
标记的 xpath,这让我发疯。框架使问题复杂化。有人可以告诉我这个的 xpath 吗?
我正在尝试编写一个 selenium 脚本并且我已经做到了:
EC.frame_to_be_available_and_switch_to_it, ((By.NAME, "main"))
之后 none 我的 xpath 尝试成功获取 <nobr>
标签中显示供应商的内容。
HTML:
另一种选择:
//nobr[.='Suppliers']/parent::span
对于框架集:
//frameset[@rows='48,*']
由于所需元素位于多个网状 <iframe>
中,因此要在元素上调用 click()
,您必须:
- 为曾祖父引入WebDriverWait
frame_to_be_available_and_switch_to_it()
. - 为祖父引入WebDriverWait
frame_to_be_available_and_switch_to_it()
. - 为parent引入WebDriverWait
frame_to_be_available_and_switch_to_it()
. - 为所需的
element_to_be_clickable()
. 引入 WebDriverWait
您可以使用以下解决方案:
使用
CSS_SELECTOR
:WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#main[name='main']"))) WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[name='marketcenterHome']"))) WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#main[name='TabNavigation']"))) element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span.tabSelText>nobr")))
使用
XPATH
:WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='main' and @name='main']"))) WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@name='marketcenterHome']"))) WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@name='TabNavigation']"))) element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='tabSelText']/nobr[text()='Suppliers']")))
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
参考
您可以在以下位置找到一些相关讨论:
很抱歉延迟返回解决方案,但问题是我需要从标题 iframe 上升一个级别以使自己进入 root,然后我才能进入 main。 一个简单的问题,但当你当时对框架了解不多时,就不那么简单了。 我感谢所有花时间回答的人。