文章目录
- 一、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
面试题:如果定位不到元素怎么办?
