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>
案例:打开‘注册实例.html’页面,完成以下操作
1). 填写主页面的注册信息
2). 填写注册页面A中的注册信息
3). 填写注册页面B中的注册信息
# 问题
1. 当前页面内无法定位注册页面A和注册页面B
说明:在Selenium中封装了如何切换frame框架的方法
方法:
1). driver.switch_to.frame(frame_reference) --> 切换到指定frame的方法
frame_reference:可以为frame框架的name、id或者定位到的frame元素
2). driver.switch_to.default_content() --> 恢复默认页面方法
在frame中操作其他页面,必须先回到默认页面,才能进一步操作
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("[email protected]")
# 切换到注册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("[email protected]")
# 切换到默认目录
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("[email protected]")
# 暂停 2
sleep(2)
# 关闭驱动对象
driver.quit()
当从注册A切换到注册B后,在切换到注册C时,需从注册A页面切换到注册C页面
由图可得只有注册A页面代码中由 注册B和注册C的iframe表单
说明:在HTML页面中,当点击超链接或者按钮时,有的会在新的窗口打开页面
需求:打开‘注册实例.html’页面,完成以下操作
1). 点击‘注册A页面’链接
2). 在打开的页面中,填写注册信息
问题:
1). 无法定位注册A页面中的元素
说明:在Selenium中封装了获取当前窗口句柄、获取所有窗口句柄和切换到指定句柄窗口的方法;
句柄:英文handle,窗口的唯一识别码
方法:
1). driver.current_window_handle --> 获取当前窗口句柄
2). driver.window_handles --> 获取所有窗口句柄
3). driver.switch_to.window(handle) --> 切换指定句柄窗口
需求:
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()
1、什么是句柄?
为窗口页面唯一标识码
2、获取当前窗口句柄方法
handles = driver.current_window_handle
3、获取所有窗口句柄
handles1 = driver.window_handles
4、获取指定窗口句柄方法
driver.switch_to.window(handle)