Python Selenium Webdriver - 导航嵌套框架组

4 投票
2 回答
6736 浏览
提问于 2025-04-18 00:26

我正在制作一个有嵌套框架的页面,但无法访问一个子框架。下面是HTML源代码的大致结构:

<html>
    <head></head>
    <frameset id="0">
        <frame name="name">
        <frameset cols="10%,20%" id="01">
            <frame name="mid1">
            <frame name="mid2" scrolling="auto" src="chkclineversion.asp" marginwidth="0" marginheight="0"> 
        </frameset>
        <frame name="bot">
    </frameset>
</html>

我需要访问一个名为“mid2”的框架。这个框架是在一个框架集里面,而这个框架集又是在主框架集里面。

我尝试了以下代码,但它们都没有用:

driver.switch_to_frame("mid2") #direct reference to nested frame name

driver.switch_to_frame(1)
driver.switch_to_frame("mid2") #switch to subframe by index and then attempt to reference "mid2". This gives me a no such frame exception1

我是不是漏掉了什么明显的东西?

我查看了这个链接,但它没有解答我的问题。

谢谢

2 个回答

2

这个 <frame> 标签的名字是 mid2,它好像被嵌套在两个额外的 <frame> 层里面。

要访问这个名字为 mid2<frame>,你需要:

  • 安全地忽略外层的 parentchild <frameset> 标签。
  • 等待第一个层级的 <frame> 可用,然后切换到它。
  • 等待第二个层级的 <frame> 可用,然后切换到它。
  • 等待你想要的 <frame> 可用,然后切换到它。
  • 你可以使用以下解决方案:

    • 代码块:

      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.NAME,"name")))
      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"frame[name='mid1']")))
      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//frame[@name='mid2' and starts-with(@src, 'chkclineversion')]")))
      
    • 注意:你需要添加以下导入:

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

你可以在这个链接找到相关讨论:如何通过 Selenium 使用 Webdriver 和 C# 定位并点击嵌套在多个 frame 和 frameset 中的元素


结束语

4

试试这个:

driver.switch_to_frame("name")
driver.switch_to_frame("mid2")

你遇到的问题是,JavaScript只能处理它当前能看到的框架。mid2在一个子框架里,如果你在文档的最上面,它是看不到这个子框架的。

撰写回答