文章目录
- (七) web自动化测试-网页frame与多窗口处理
- 前言
- 一、selenium处理frame
- 1. frame概要
- 2. frame示例
- 二、selenium处理多窗口
- 1. 多窗口切换概要
- 2. 多窗口切换处理示例
- 总结
前言
主要介绍多frame和多窗口的场景下,selenium是如何去处理的
一、selenium处理frame 1. frame概要- 在web自动化中,如果一个元素定位不到,很有可能定位的元素在iframe中
- frame是html中的框架,在html中,所谓的框架就是可以在同一个浏览器中显示不止一个页面
- 基于html框架,又分为垂直架构和水平架构
frame分为三种:frameset、frame、iframe
- frmeset和普通的html标签一样,不会影响正常的定位,可使用常用的定位方法进行定位
- frame和iframe在selenium则是有一组方法进行操作
frame嵌套分为两种:一种是嵌套的,一种是未嵌套的
切换frame语法:
- driver.switch_to.frame():根据元素id或者index切换frame
- driver.switch_to.default_content():切换到默认frame
- driver.switch_to.parent_frame():切换到父级frame
对于未嵌套frame:
- driver.switch_to.frame(“frame id”)
- driver.switch_to.frame(“frame-index”)frame无ID的时候依据索引来处理,索引从0开始,例如:driver.switch_to.frame(0)
对于嵌套的frame:
- 对于嵌套的frame需要先进入到iframe的父节点,再进入到子节点,然后可以对字节点里面的对象进行处理和操作
- driver.switch_to.frame(“父节点”)
- driver.switch_to.farme(“子节点”)
打开网址:https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable
from selenium import webdriver
from selenium.webdriver.common.by import By
class TestFrame:
def setup(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.implicitly_wait(3)
self.driver.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
def teardown(self):
self.driver.quit()
def test_frame(self):
# 打开页面后,进入到id=iframeResult的frame下,操作元素
self.driver.switch_to.frame("iframeResult")
print(self.driver.find_element(By.XPATH, '//*[@id="draggable"]').text)
# 操作完成后,回到页面,操作"点击运行",使用parent_frame()或default_content()
self.driver.switch_to.parent_frame()
self.driver.find_element(By.XPATH, '//*[@id="submitBTN"]').click()
二、selenium处理多窗口
1. 多窗口切换概要
简介:
- 点击某个功能时,可能会重新打开一个窗口,对于这种情况,想在新的页面操作,就需要先切换窗口
- 获取窗口的唯一标识用句柄表示,所以只需要切换句柄,就可以在多个页面灵活操作了
多窗口处理的流程:
- 1 先获取到当前的窗口句柄(driver.current_window_handle)
- 2 再获取到所有的窗口句柄(driver.window_handles)
- 3 判断是否是想要的操作窗口,如果是,就可以对窗口进行操作,如果不是,跳转到另外一个窗口,对另一个窗口进行操作(driver.switch_to_window)
场景需求:
- 打开百度首页
- 点击登录按钮
- 弹框中点击注册按钮,输入用户名和密码
- 返回刚才的登录页,点击登录
- 输入用户名和密码,低钠基登录
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
class TestWindows:
def setup(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.implicitly_wait(3)
self.driver.get("https://www.baidu.com")
def teardown(self):
self.driver.quit()
def test_windows(self):
self.driver.find_element(By.XPATH, '//*[@id="s-top-loginbtn"]').click()
self.driver.find_element(By.XPATH, '//*[@id="TANGRAM__PSP_11__regLink"]').click()
# 点击立刻注册后,通过driver.window_handles和driver.switch_to.window切换窗口至注册页面进行操作
windows = self.driver.window_handles
self.driver.switch_to.window(windows[-1])
self.driver.find_element(By.XPATH, '//*[@id="TANGRAM__PSP_4__userName"]').send_keys("test20220527")
self.driver.find_element(By.XPATH, '//*[@id="TANGRAM__PSP_4__phone"]').send_keys("13000000000")
self.driver.find_element(By.XPATH, '//*[@id="TANGRAM__PSP_4__password"]').send_keys("Aa123456")
self.driver.find_element(By.XPATH, '//*[@id="TANGRAM__PSP_4__verifyCode"]').send_keys("1234")
self.driver.find_element(By.XPATH, '//*[@id="TANGRAM__PSP_4__isAgree"]').click()
self.driver.find_element(By.XPATH, '//*[@id="TANGRAM__PSP_4__submit"]')
# 注册页面操作完成后,切换回上一个窗口
self.driver.switch_to.window(windows[-2])
self.driver.find_element(By.XPATH, '//*[@id="TANGRAM__PSP_11__userName"]').send_keys("13000000000")
self.driver.find_element(By.XPATH, '//*[@id="TANGRAM__PSP_11__password"]').send_keys("Aa123456")
self.driver.find_element(By.XPATH, '//*[@id="TANGRAM__PSP_11__submit"]').click()
sleep(5)
注:
- driver.window_handles获取当前打开浏览器所有窗口句柄,通常是按照顺序打开的,改方法返回的为list列表,所以可以通过返回列表的索引取出窗口句柄
- driver.switch_to.window的传入参数为窗口句柄,根据上面获得的句柄,传入该方法,即可实现窗口的切换
总结
知识点:
frame处理:switch_to.frame,传入frame的id,即可进入对应的frame,返回上一层用parent_frame(),返回初始页面使用default_content()
多窗口处理:driver.window_handles,获取当前driver打开的窗口句柄列表,根据需要操作的窗口的索引使用switch_to.window()进行窗口的切换



