如何使用 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。 一个简单的问题,但当你当时对框架了解不多时,就不那么简单了。 我感谢所有花时间回答的人。