【UI自动化测试】10_web自动化测试 _frame切换、多窗口切换

文章目录

  • 一、frame切换
    • [1.1 frame](#1.1 frame)
    • [1.2 frame方法](#1.2 frame方法)
    • [1.3 frame切换-案例](#1.3 frame切换-案例)
  • 二、多窗口切换
    • [2.1 多窗口切换-方法](#2.1 多窗口切换-方法)
    • [2.2 多窗口切换-案例](#2.2 多窗口切换-案例)
      • [2.2.1 案例1](#2.2.1 案例1)
      • [2.2.2 多窗口工具封装](#2.2.2 多窗口工具封装)
  • 三、小结

一、frame切换

  • 当前窗口中的元素如果在iframe标签的子网页中,不能直接进行元素定位,需要先进行frame切换才能进行定位和操作。
  • 如何分析所定位的元素是否在iframe标签中:
yacas 复制代码
经验:当定位元素时,界面所看到样式如果是一块独立的区域,而且该区域和周围的样式完全不一样,就可以适当留意是否在一个iframe标签中。

提示:常用的frame表单有两种:frameset形式、iframe标签形式

1.1 frame

html 复制代码
frame:HTML页面中的一种框架,主要作用是在当前页面中指定区域显示另一页面元素。

形式一: [了解]
	<frameset cols="25%,75%">
		<frame src="frame_a.htm">
		<frame src="frame_b.htm">
	</frameset>

形式二:
	<iframe name="iframe_a" src="demo_iframe.htm" width="200" height="200"></iframe>

1.2 frame方法

python 复制代码
# 说明: 在Selenium中封装了如何切换frame框架的方法
# 步骤:
1、切换到iframe     driver.switch_to.frame(frame_reference) --> 切换到指定frame的方法
2、操作元素				
3、回到默认页面      driver.switch_to.default_content() --> 恢复默认页面方法
	
注:
- frame_reference:可以为frame框架的name、id或者定位到的frame元素
- 在frame中操作其他页面,必须先回到默认页面,才能进一步操作

1.3 frame切换-案例

python 复制代码
# 导包
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select

# 获取浏览器驱动对象
driver = webdriver.Chrome()
# 最大化浏览器
driver.maximize_window()
# 隐式等待
# driver.implicitly_wait(30)
# 打开url
url = r"D:\web自动化素材\课堂素材\注册实例.html"
driver.get(url)


"""
    需求:
        1. 打开注册实例.html
        2. 填写注册A 页面信息
        3. 填写注册B 页面信息   
"""

# 获取注册A iframe元素
A = driver.find_element(By.CSS_SELECTOR, "#idframe1")
# 1、切换到A
driver.switch_to.frame(A)
# 2、注册A操作
driver.find_element(By.CSS_SELECTOR,"#userA").send_keys("admin")

# 3、回到默认目录 注册时例.html
driver.switch_to.default_content()

# 4、获取注册B iframe元素
B = driver.find_element(By.CSS_SELECTOR, "#idframe2")
# 5、切换到B
driver.switch_to.frame(B)

# 6、注册B操作
driver.find_element(By.CSS_SELECTOR,"#userB").send_keys("admin")

# 关闭浏览器
sleep(3)
driver.quit()

二、多窗口切换

多窗口:在HTML页面中, 当点击超链接或者按钮时, 有的会在新的窗口打开页面。

yacas 复制代码
为什么要切换窗口?  
- 页面存在多个窗口式,selenium默认焦点只会在主窗口上所有的元素,不切换窗口,无法操作除主窗口以外的窗口内元素

2.1 多窗口切换-方法

  • 窗口切换:selenium需要通过窗口的句柄来实现窗口的切换!
  • 句柄: 英文handle, 窗口的唯一识别码
python 复制代码
步骤:
1) handles = driver.window_handles 			 --> 获取所有窗口句柄
2) driver.switch_to.window(handles[n])       --> 切换指定句柄窗口

3) driver.current_window_handle 	         --> 获取当前窗口句柄

- selenium只能定位当前窗口中的元素,要定位新的窗口的元素就必须进行窗口切换!

2.2 多窗口切换-案例

2.2.1 案例1

python 复制代码
from time import sleep

from selenium import webdriver

# 1、获取浏览器
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select

driver = webdriver.Chrome()
driver.implicitly_wait(10)
# 2、打开url
driver.get("file:///Users/lgy/Documents/fodder/web/Register.html")

"""
    为什么要处理多窗口?-- selenium默认焦点在启动窗口,要操作其他窗口必须处理。
    需求:
        1、打开注册示例页面
        2、点击注册A网页链接
        3、填写注册A网页内容
"""
print("操作之前所有窗口的句柄:", driver.window_handles)

driver.find_element(By.LINK_TEXT, "注册A网页").click()
# 获取所有窗口句柄
handles = driver.window_handles
print("操作之后所有窗口的句柄:", handles)

# 重点:切换窗口
driver.switch_to.window(handles[1])

# 填写注册A网页 用户名
driver.find_element(By.CSS_SELECTOR, "#userA").send_keys("admin")


# 4、关闭浏览器
sleep(3)
driver.quit()

2.2.2 多窗口工具封装

python 复制代码
from time import sleep

from selenium import webdriver

# 1、获取浏览器
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select

driver = webdriver.Chrome()
driver.implicitly_wait(10)
# 2、打开url
driver.get("file:///Users/lgy/Documents/fodder/web/Register.html")

"""
   需求:
        如何随心所欲切换窗口?
    思路:
        1、获取所有窗口句柄
        2、切换窗口
        3、获取当前所在窗口title
        4、判断title是否为需要的窗口
        5、执行代码
    需求:
        1、打开注册示例页面
        2、点击 注册A网页 注册B网页
        3、在A网页和B网页中输入 对用户名输入 admin 
"""


def switch_window(title):
    # 1、获取所有窗口句柄
    handels = driver.window_handles
    # 2、遍历句柄进行切换
    for handel in handels:
        # 操作
        driver.switch_to.window(handel)
        # 获取当前窗口title 并且 判断是否自己需要的窗口
        if driver.title == title:
            # 操作代码
            return "已找到{}窗口,并且已切换成功".format(title)

title_A = "注册A"
title_B = "注册B"

# 打开注册A和注册B网页
driver.find_element(By.LINK_TEXT, "注册A网页").click()
driver.find_element(By.LINK_TEXT, "注册B网页").click()


# 填写注册A网页 用户名
print(switch_window(title_A))
driver.find_element(By.CSS_SELECTOR, "#userA").send_keys("admin")

print(switch_window(title_B))
driver.find_element(By.CSS_SELECTOR, "#userB").send_keys("admin")

# 4、关闭浏览器
sleep(3)
driver.quit()

三、小结

yacas 复制代码
面试题:如果定位不到元素怎么办?  
相关推荐
uhakadotcom1 小时前
Hono v4.12.0 发布!路由提速2倍+,JSON响应飞起来
前端·面试·github
HelloReader1 小时前
做 IM 客户端,选 Tauri 还是 Qt一篇把坑讲清楚的选型与架构指南
前端
HelloReader1 小时前
Tauri 2 创建项目全流程create-tauri-app 一键脚手架 + Tauri CLI 手动接入
前端·javascript·vue.js
Full Stack Developme2 小时前
语法树与自动化技术
运维·前端·自动化
shix .2 小时前
旅行网站控制台检测
开发语言·前端·javascript
哆啦A梦15882 小时前
Vue3魔法手册 作者 张天禹 016_vue3中一些特定用法介绍
前端·vue.js·typescript
henry1010103 小时前
DeepSeek生成的网页小游戏 - 迷你高尔夫
前端·javascript·游戏·html
薛一半3 小时前
React的组件
前端·javascript·react.js