如何使用Selenium和Python在嵌套iFrame中定位元素

如何使用Selenium和Python在嵌套iFrame中定位元素,python,html,selenium,xpath,frame,Python,Html,Selenium,Xpath,Frame,试图在页面底部找到标记的xpath,这让我抓狂。框架使问题复杂化。有人能告诉我这个的xpath吗 我正在尝试编写一个selenium脚本,我已经做到了: EC.frame_to_be_available_and_switch_to_it, ((By.NAME, "main")) 在此之后,我的xpath尝试都没有成功地获取标记中的内容,标记上写着supplier HTML: 另一个选项: //nobr[.='Suppliers']/parent::span 对于框架集: //frameset

试图在页面底部找到
标记的xpath,这让我抓狂。框架使问题复杂化。有人能告诉我这个的xpath吗

我正在尝试编写一个selenium脚本,我已经做到了:

EC.frame_to_be_available_and_switch_to_it, ((By.NAME, "main"))
在此之后,我的xpath尝试都没有成功地获取
标记中的内容,标记上写着supplier

HTML:

另一个选项:

//nobr[.='Suppliers']/parent::span
对于框架集:

//frameset[@rows='48,*']

由于所需元素位于多个网络
中,因此要在元素上调用
单击()
,您必须:

  • 诱导WebDriverWait,使伟大的祖父母
    框架\u可用\u并\u切换到\u it()
  • 诱导WebDriverWait使父级
    框架\u可用\u并将\u切换到\u it()
  • 将父
    帧的WebDriverWait设置为\u可用,\u并将\u切换为\u it()
  • 将所需
    元素的WebDriverWait设置为可单击()
  • 您可以使用以下解决方案:

    • 使用
      CSS\u选择器

      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中提升一个级别才能进入根目录,然后才能进入主目录。 这是一个简单的问题,但当你不太了解帧的时候就不那么简单了。
我感谢每一位花时间回答问题的人。

//span[@class=“tabSelText”]
?如果有多个条目,请在Span之前添加节点。我理解该部分,但我在main之后的某个地方出错了。有人对此有什么想法吗。我花了太长时间试图弄明白这一点,因为它们是嵌套的帧,所以你必须遍历它们。您可能必须先切换到帧集才能获得第二帧。然后切换到该帧内的帧集。。。然后切换到框架集中的框架,这就是您的跨度所在。谢谢pcalkins。我往下看了一点,但是下一个框架集没有id。这可能吗?当它如此复杂的时候,框架对我来说是新的。这是下一个,希望是最后一个框架集,只是不知道如何进入,谢谢你的详细回复。我似乎有一个问题,我无法切换到主,因为它无法找到。在此之前,我已成功切换到与main相同级别的标题框,并单击了一个链接。在我选择main之前,是否需要执行一些操作来退出标题?已修复。明天我会发布解决方案