多窗口处理与⽹页frame:
selenium⾥⾯如何处理多窗口场景
❖ 多个窗口识别
❖ 多个窗口之间切换
selenium⾥⾯如何处理frame
❖ 多个frame识别
❖ 多个frame之间切换
多窗口处理:
点击某些链接,会重新打开⼀个窗口,对于这种情况,想在新页⾯上操作,就 得先切换窗口了。
获取窗口的唯⼀标识⽤句柄表示,所以只需要切换句柄,就可以在多个页⾯灵 活操作了。
多窗口处理流程:
❖ 1. 先获取到当前的窗口句柄(driver.current_window_handle)
❖ 2. 再获取到所有的窗口句柄(driver.window_handles)
❖ 3. 判断是否是想要操作的窗口,如果是,就可以对窗口进⾏操作,如果不是, 跳转到另外⼀个窗口,对另⼀个窗⼜进⾏操作 (driver.switch_to_window)
多窗口切换案例:
打开百度页⾯
❖ 点击登录,
❖ 弹框中点击 ‘⽴即注册’,输⼊⽤户名 和帐号
❖ 返回刚才的登录页,点击登录
❖ 输⼊⽤户名和密码,点击登录
frame介绍:
在web⾃动化中,如果⼀个元素定位不到,那么很⼤可能是在iframe中。
❖ 什么是frame?
❖ frame是html中的框架,在html中,所谓的框架就是可以在同⼀个浏览器中显⽰不⽌⼀个页⾯。
❖ 基于html的框架,又分为垂直框架和⽔平框架(cols,rows)
❖ Frame 分类
❖ frame标签包含frameset、frame、iframe三种,
❖ frameset和普通的标签⼀样,不会影响正常的定位,可以使⽤index、id、name 、webelement任意种⽅式定位 frame。
❖ ⽽frame与iframe对selenium定位⽽⾔是⼀样的。selenium有⼀组⽅法对frame进⾏操作
❖ 演⽰:https://www.w3school.com.cn/tiy/t.asp?f=html_frame_cols
多frame切换:
frame存在两种:
❖ ⼀种是嵌套的,⼀种是未嵌套的
切换frame
❖ driver.switch_to.frame() # 根据元素id或者index切换切换frame
❖ driver.switch_to.default_content() # 切换到默认frame
❖ driver.switch_to.parent_frame() # 切换到⽗级frame
frame未嵌套:
处理未嵌套的iframe
❖ driver.switch_to_frame(“frame 的 id”)
❖ driver.switch_to_frame(“frame - index”) frame⽆ID的时候依据索引来处 理,索引从0开始 driver.switch_to_frame(0)
Frame嵌套:
处理嵌套的iframe
❖ 对于嵌套的先进⼊到iframe的⽗节点,再进到⼦节点,然后可以对⼦节点⾥ ⾯的对象进⾏处理和操作
❖ driver.switch_to.frame(“⽗节点”)
❖ driver.switch_to.frame(“⼦节点”)
多frame切换案例:
多frame切换案例:
❖ 打开包含frame的web页⾯ https:// www.runoob.com/try/ try.php?filename=jqueryui-apidroppable
❖ 打印’请拖拽我’元素的⽂本
❖ 打印’点击运⾏’元素的⽂本
多frame切换案例:
def test_framedeal_1(self):
self.driver.get(“https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
self.driver.switch_to.frame("iframeResult")
print(self.driver.find_element_by_id("droppable").text)
self.driver.switch_to.parent_frame()
print(self.driver.find_element_by_id("submitBTN").text)
self.driver.switch_to.frame("iframeResult")`是 Selenium WebDriver 中的一个方法,它表示切换到名为 "iframeResult" 的 frame。
self.driver.switch_to.parent_frame() 是 Selenium WebDriver 中的一个方法,它表示切换到父级 frame。
在 Selenium WebDriver 中,每个窗口或标签页都拥有一个唯一的窗口句柄(handle),用于在多窗口操作中标识和切换不同的窗口。
1.打印出当前浏览器窗口的句柄:print(self.driver.current_window_handle)
2.print(self.driver.window_handles)` 这行代码的作用是打印出所有窗口的句柄(handles)