写点什么

软件测试学习笔记丨 Selenium 多 frame 切换

作者:测试人
  • 2024-05-29
    北京
  • 本文字数:1351 字

    阅读完需:约 4 分钟

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/22518

说明:本篇博客基于 selenium 4.1.0

场景说明

  • 场景:页面存在 frame、iframe 嵌套结构。frame 是 html 中的一种标签,可在一个页面中拼接多个网页

  • 问题:selenium 不能直接定位和操作处于 frame、iframe 内的元素

  • 解决:使用 selenium 的 frame 切换功能,切换到 frame 内后再进行操作



切换步骤

# 步骤1:根据frame定位,创建frame对象ele_frame = driver.find_element(By.XPATH, '/html/body/iframe')
# 步骤2:传入frame对象,切换到对应frame中# 备注:# 1.可直接传入frame的id、name信息# 2.可直接传入frame的frame编号,dom结构中的第一个frame编号为0# 3.存在frame嵌套,即frame中的frame,需要一层层的进入driver.switch_to.frame(ele_frame)
# 步骤3:退出当前framedriver.switch_to.default_content() # 切换到默认framedriver.switch_to.parent_frame() # 切换到父级frame
复制代码

示例

import timefrom selenium import webdriverfrom selenium.webdriver.common.by import By
driver = webdriver.Chrome()driver.implicitly_wait(10)driver.get('http://sahitest.com/demo/iframesTest.htm')locator_link = (By.CSS_SELECTOR, '[href="linkTest.htm"]')

print(len(driver.find_elements(*locator_link))) # 未切换frame,元素列表长度为0,说明selenium查询元素失败
# 切换到frame内ele_frame = driver.find_element(By.XPATH, '/html/body/iframe')driver.switch_to.frame(ele_frame)
print(len(driver.find_elements(*locator_link))) # 切换frame后,元素列表长度为1,说明selenium查询元素成功driver.find_element(*locator_link).click() # 元素可正常点击
# 返回主页面driver.switch_to.parent_frame()driver.find_element(By.CSS_SELECTOR, '[value="Click me"]').click() # 主页面元素可正常点击

time.sleep(3)driver.quit()
复制代码

driver.switch_to.frame()源码

def frame(self, frame_reference) -> None:    """    Switches focus to the specified frame, by index, name, or webelement.
Args: - frame_reference: The name of the window to switch to, an integer representing the index, or a webelement that is an (i)frame to switch to. Usage: driver.switch_to.frame('frame_name') driver.switch_to.frame(1) driver.switch_to.frame(driver.find_elements(By.TAG_NAME, "iframe")[0]) """ # 传入参数为str,selenium会尝试进行定位获取frame元素对象 if isinstance(frame_reference, str): try: frame_reference = self._driver.find_element(By.ID, frame_reference) except NoSuchElementException: try: frame_reference = self._driver.find_element(By.NAME, frame_reference) except NoSuchElementException: raise NoSuchFrameException(frame_reference) # 切换到frame self._driver.execute(Command.SWITCH_TO_FRAME, {'id': frame_reference})
复制代码

软件测试开发免费视频教程分享


发布于: 刚刚阅读数: 4
用户头像

测试人

关注

专注于软件测试开发 2022-08-29 加入

霍格沃兹测试开发学社,测试人社区:https://ceshiren.com/t/topic/22284

评论

发布
暂无评论
软件测试学习笔记丨Selenium 多frame切换_软件测试_测试人_InfoQ写作社区