Selenium-frame切换、多窗口切换

1、frame切换

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.1 为什么要学习frame切换

案例:打开‘注册实例.html’页面,完成以下操作 
1). 填写主页面的注册信息 
2). 填写注册页面A中的注册信息 
3). 填写注册页面B中的注册信息

# 问题
1. 当前页面内无法定位注册页面A和注册页面B

1.2 frame切换方法

说明:在Selenium中封装了如何切换frame框架的方法 

方法:
	1). driver.switch_to.frame(frame_reference) --> 切换到指定frame的方法 
			frame_reference:可以为frame框架的name、id或者定位到的frame元素 
	
	2). driver.switch_to.default_content() --> 恢复默认页面方法
			在frame中操作其他页面,必须先回到默认页面,才能进一步操作

1.3 案例解决方案

1. 完成主页面注册信息; 
2. 调用frame切换方法(switch_to.frame("myframe1"))切换到注册用户A框架中 
3. 调用恢复默认页面方法(switch_to.default_content()) 
4. 调用frame切换方法(switch_to.frame("myframe2"))切换到注册用户B框架中


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


"""
    目标: 为什么要切换frame表单
    需求:
        1. 打开注册实例.html
        2. 填写主页面 页面信息
        3. 填写注册A 页面信息
        4. 填写注册B 页面信息
    
"""
"""填写主页面"""
# 用户名
driver.find_element_by_css_selector("#user").send_keys("admin")
# 密码
driver.find_element_by_css_selector("#password").send_keys("admin")
# 电话
driver.find_element_by_css_selector(".tel").send_keys("18611112222")
# 邮件
driver.find_element_by_css_selector("#email").send_keys("123@qq.com")

# 切换到注册A 使用name
# driver.switch_to.frame("myframe1")
# 使用id
driver.switch_to.frame("idframe1")

"""填写注册A"""
# 用户名
driver.find_element_by_css_selector("#userA").send_keys("admin")
# 密码
driver.find_element_by_css_selector("#passwordA").send_keys("admin")
# 电话
driver.find_element_by_css_selector(".telA").send_keys("18611112222")
# 邮件
driver.find_element_by_css_selector("#emailA").send_keys("123@qq.com")

# 切换到默认目录
driver.switch_to.default_content()

# 切换到注册B 使用name
# driver.switch_to.frame("myframe2")
# 使用元素切换
driver.switch_to.frame(driver.find_element_by_css_selector("[name='myframe2']"))



"""填写注册B"""
# 用户名
driver.find_element_by_css_selector("#userB").send_keys("admin")
# 密码
driver.find_element_by_css_selector("#passwordB").send_keys("admin")
# 电话
driver.find_element_by_css_selector(".telB").send_keys("18611112222")
# 邮件
driver.find_element_by_css_selector("#emailB").send_keys("123@qq.com")



# 暂停 2
sleep(2)
# 关闭驱动对象
driver.quit()

1.4 总结表单切换

当从注册A切换到注册B后,在切换到注册C时,需从注册A页面切换到注册C页面

由图可得只有注册A页面代码中由 注册B和注册C的iframe表单

在这里插入图片描述

2.多窗口切换

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

2.1 为什么要切换窗口?

需求:打开‘注册实例.html’页面,完成以下操作 
	1). 点击‘注册A页面’链接 
	2). 在打开的页面中,填写注册信息

问题:
	1). 无法定位注册A页面中的元素

2.2 如何实现多窗口切换?

说明:在Selenium中封装了获取当前窗口句柄、获取所有窗口句柄和切换到指定句柄窗口的方法; 
	句柄:英文handle,窗口的唯一识别码 
方法:
	1). driver.current_window_handle --> 获取当前窗口句柄
	2). driver.window_handles --> 获取所有窗口句柄 
	3). driver.switch_to.window(handle) --> 切换指定句柄窗口

2.3 案例解决方案分析

需求:
	1、百度搜索“CSDN”
	2、获取“百度”当前窗口句柄
	3、点击CSDN链接
	4、获取所有窗口句柄
	5、获取“CSDN”当前窗口句柄
	6、操作“CSDN”页面元素


# 需求:打开百度,在搜索框上输入CSDN,悬停

# 导包
import time
from time import sleep

from selenium import webdriver

# 获取浏览器驱动对象
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
# 窗口最大化
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(30)

url = "https://www.baidu.com"

driver.get(url)

# handles = driver.current_window_handle
# print("百度页面当前句柄为:", handles)
# 使用CSS id选择器获取搜索框
driver.find_element_by_css_selector("#kw").send_keys("CSDN")

driver.find_element_by_css_selector("[value= '百度一下']").click()

# handles1 = driver.window_handles
# print("所有页面句柄为:", handles1)


while True:
    try:
        start = time.perf_counter()
        driver.find_element_by_xpath('/html/body/div[2]/div[4]/div[1]/div[3]/div[1]/div/div[1]/h3/a[1]').click()
        print('已经定位到元素')
        end = time.perf_counter()

        print("元素定位时间为", start + end)
        break
    except:
        print("未定位到元素")

# 获取所有页面句柄
handles = driver.window_handles
print("所有页面句柄", handles)

driver.switch_to.window(handles[1])

driver.find_element_by_css_selector('#toolbar-search-input').send_keys("测试")
driver.find_element_by_css_selector("#toolbar-search-button").click()

sleep(3)

driver.quit()

2.4 多窗口切换-总结

1、什么是句柄?
为窗口页面唯一标识码
2、获取当前窗口句柄方法
handles = driver.current_window_handle
3、获取所有窗口句柄
handles1 = driver.window_handles
4、获取指定窗口句柄方法
driver.switch_to.window(handle)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炫酷的腿毛!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值