iframe框 的正常处理和非正常处理

发布时间 2023-09-25 17:18:51作者: 徐俊112

我们都知道iframe 是HTML里面的一个用于网页嵌套网页的框架,一个网页可以嵌套到另一个网页中,可以嵌套多层,当然也可以平衡嵌套,常见的一般有两种:

  • 嵌套 框架 (大框架下包含小框架)

  • 平行 嵌套 (平衡摆放,平级关系)

    一般定位iframe的方法
    1、iframe有具体的name 和 id 属性(id和name的属性值如果是动态变化的数字 就不能使用)

    .switch_to_iframe("id or name 的属性值")

    2、iframe标签本身没有id 和 name 属性

    方式1:定位iframe元素
    iframe = driver.find_elements_by_tag_name("iframe")[0] # 根据需要填入index,这里定位HTML里的第一个
    driver.switch_to.frame(iframe)
    方式2:用Xpath或css定位到iframe的父类
    name = driver.find_element_by_xpath('//*[@id="panel"]')
    driver.switch_to_iframe(name)
    1
    3、框架有进入就会有退出 — 针对平行iframe标签

    .switch_to.default_content()

到这里你会发现,代码跑不通:

下面说说,定位163邮箱遇到的一些坑

坑一:
  • 输入代码:用固定id的方法定位
# import time
# from selenium import webdriver
# driver = webdriver.Chrome()
# driver.get("https://email.163.com")
# time.sleep(50)        # 我怕不够时间加载,所以时间加长了(排除时间太短产生timeout的错误)
# driver.switch_to.default_content()
# driver.switch_to.frame('x-URS-iframe1565846475124.4539')   # 切换到框架(这里用了ID属性)
# driver.find_element_by_name("email").send_keys("bingo")
# time.sleep(1)
# driver.find_element_by_name("password").send_keys("123456")
# time.sleep(1)
# driver.find_element_by_id("dologin").click()
# driver.switch_to.default_content()  # 退出框架
  • 报错:定位不到对应的iframe
  • in frame raise NoSuchFrameException(frame_reference)
    selenium.common.exceptions.NoSuchFrameException: Message: x-URS-iframe

  经过分析得出: iframe 的id值是不停变化的

 发现这里的iframe标签的id会变动,所以不能用id属性直接定位,需要更改定位方式

坑二:
  • 输入代码:用xpath定位iframe的父类
# import time
# from selenium import webdriver
# driver = webdriver.Chrome()
# driver.get("https://email.163.com")
# time.sleep(2)
# name = driver.find_element_by_xpath('//*[@id="panel"]')     # iframe 的父类
# driver.switch_to.frame(name)
# driver.find_element_by_name("email").send_keys("bingo")
# time.sleep(1)
# driver.find_element_by_name("password").send_keys("123456")
# time.sleep(1)
# driver.find_element_by_id("dologin").click()
# driver.switch_to.default_content()  # 退出框架
  • 报错:定位到的元素不是框架
  • in check_response raise exception_class(message, screen, stacktrace)
    selenium.common.exceptions.NoSuchFrameException: Message: no such frame: element is not a frame
  • 分析:既让定位到的是元素,那我就直接定位iframe标签了
    • 解决:
      输入代码
    • # import time
      # from selenium import webdriver
      # driver = webdriver.Chrome()
      # driver.get("https://email.163.com")
      # time.sleep(2)
      # iframe = driver.find_elements_by_tag_name("iframe")[0]
      # driver.switch_to.frame(iframe)
      # driver.find_element_by_name("email").send_keys("bingo")
      # time.sleep(1)
      # driver.find_element_by_name("password").send_keys("123456")
      # time.sleep(1)
      # driver.find_element_by_id("dologin").click()
      # driver.switch_to.default_content()  # 退出框架

本文遇见的情况就是: 元素属性值不是唯一的,每次的值都会随机发生变化

    解决办法: 通过定位框架的层级或者标签来定位,不是定位某个固定元素值


原文链接:https://blog.csdn.net/weixin_44342166/article/details/99635635