frame切换/窗口切换
如果我们要 选择 下图方框中 所有的 蔬菜,使用css选择,怎么写表达式?
当然,要先查看到它们的html元素特征
大家可能会照旧写出如下代码:
from selenium import webdriverwd = webdriver.Chrome(r'd:\webdrivers\chromedriver.exe')wd.get('http://f.python3.vip/webauto/sample2.html')# 根据 class name 选择元素,返回的是 一个列表
elements = wd.find_elements_by_class_name('plant')for element in elements:print(element.text)
运行一下,你就会发现,运行结果打印内容为空白,说明没有选择到 class 属性值为 plant 的元素。
为什么呢?
因为仔细看,你可以发现, 这些元素是在一个叫 iframe的 元素中的。
这个 iframe 元素非常的特殊, 在html语法中,frame 元素 或者iframe元素的内部 会包含一个 被嵌入的 另一份html文档。
在我们使用selenium打开一个网页是, 我们的操作范围 缺省是当前的 html , 并不包含被嵌入的html文档里面的内容。
如果我们要 操作 被嵌入的 html 文档 中的元素, 就必须 切换操作范围
到 被嵌入的文档中。
怎么切换呢?
使用 WebDriver 对象的 switch_to 属性,像这样
wd.switch_to.frame(frame_reference)
其中, frame_reference 可以是 frame 元素的属性 name 或者 ID 。
比如这里,就可以填写 iframe元素的id ‘frame1’ 或者 name属性值 ‘innerFrame’。
像这样
wd.switch_to.frame('frame1')
或者
wd.switch_to.frame('innerFrame')
也可以填写frame 所对应的 WebElement 对象。
我们可以根据frame的元素位置或者属性特性,使用find系列的方法,选择到该元素,得到对应的WebElement对象
比如,这里就可以写
wd.switch_to.frame(wd.find_element_by_tag_name("iframe"))
然后,就可以进行后续操作frame里面的元素了。
上面的例子的正确代码如下
from selenium import webdriverwd = webdriver.Chrome(r'd:\webdrivers\chromedriver.exe')wd.get('http://f.python3.vip/webauto/sample2.html')# 先根据name属性值 'innerFrame',切换到iframe中
wd.switch_to.frame('innerFrame')# 根据 class name 选择元素,返回的是 一个列表
elements = wd.find_elements_by_class_name('plant')for element in elements:print(element.text)
如果我们已经切换到某个iframe里面进行操作了,那么后续选择和操作界面元素 就都是在这个frame里面进行的。
这时候,如果我们又需要操作 主html(我们把最外部的html称之为主html) 里面的元素了呢?
怎么切换回原来的主html呢?
很简单,写如下代码即可
wd.switch_to.default_content()
例如,在上面 代码 操作完 frame里面的元素后, 需要 点击 主html 里面的按钮,就可以这样写
from selenium import webdriverwd = webdriver.Chrome(r'd:\webdrivers\chromedriver.exe')wd.get('http://f.python3.vip/webauto/sample2.html')# 先根据name属性值 'innerFrame',切换到iframe中
wd.switch_to.frame('innerFrame')# 根据 class name 选择元素,返回的是 一个列表
elements = wd.find_elements_by_class_name('plant')for element in elements:print(element.text)# 切换回 最外部的 HTML 中
wd.switch_to.default_content()# 然后再 选择操作 外部的 HTML 中 的元素
wd.find_element_by_id('outerbutton').click()wd.quit()
切换到新的窗口
在网页上操作的时候,我们经常遇到,点击一个链接 或者 按钮,就会打开一个 新窗口
。
请大家点击这里,打开这个链接
在打开的网页中,点击 链接 “访问bing网站” , 就会弹出一个新窗口,访问bing网址。
如果我们用Selenium写自动化程序 在新窗口里面 打开一个新网址, 并且去自动化操作新窗口里面的元素,会有什么问题呢?
问题就在于,即使新窗口打开了, 这时候,我们的 WebDriver对象对应的 还是老窗口,自动化操作也还是在老窗口进行,
我们可以运行如下代码验证一下
from selenium import webdriverwd = webdriver.Chrome(r'd:\webdrivers\chromedriver.exe')
wd.implicitly_wait(10)wd.get('http://f.python3.vip/webauto/sample3.html')# 点击打开新窗口的链接
link = wd.find_element_by_tag_name("a")
link.click()# wd.title属性是当前窗口的标题栏 文本
print(wd.title)
运行完程序后,最后一行 打印当前窗口的标题栏 文本, 输出内容是
白月黑羽测试网页3
说明, 我们的 WebDriver对象指向的还是老窗口,否则的话,运行结果就应该新窗口的标题栏 “微软Bing搜索”
如果我们要到新的窗口里面操作,该怎么做呢?
可以使用Webdriver对象的switch_to属性的 window方法,如下所示:
wd.switch_to.window(handle)
其中,参数handle需要传入什么呢?
WebDriver对象有window_handles 属性,这是一个列表对象, 里面包括了当前浏览器里面所有的窗口句柄。
所谓句柄,大家可以想象成对应网页窗口的一个ID,
那么我们就可以通过 类似下面的代码,
for handle in wd.window_handles:# 先切换到该窗口wd.switch_to.window(handle)# 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口if 'Bing' in wd.title:# 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环,break
上面代码的用意就是:
我们依次获取 wd.window_handles 里面的所有 句柄 对象, 并且调用 wd.switch_to.window(handle) 方法,切入到每个窗口,
然后检查里面该窗口对象的属性(可以是标题栏,地址栏),判断是不是我们要操作的那个窗口,如果是,就跳出循环。
同样的,如果我们在新窗口 操作结束后, 还要回到原来的窗口,该怎么办?
我们可以仍然使用上面的方法,依次切入窗口,然后根据 标题栏 之类的属性值判断。
还有更省事的方法。
因为我们一开始就在 原来的窗口里面,我们知道 进入新窗口操作完后,还要回来,可以事先 保存该老窗口的 句柄,使用如下方法
# mainWindow变量保存当前窗口的句柄
mainWindow = wd.current_window_handle
切换到新窗口操作完后,就可以直接像下面这样,将driver对应的对象返回到原来的窗口
#通过前面保存的老窗口的句柄,自己切换到老窗口
wd.switch_to.window(mainWindow)
frame切换/窗口切换相关推荐
- Frame及窗口切换
引入(目的):了解Html中框架的概念,掌握使用WebDriver 对象的 switch_to 属性进行框架转换,方便在selenium中定位到框架中的元素进行操作.同时,明确窗口句柄的定义,掌握应用 ...
- python+selenium+new——窗口——网页——切换窗口——切换frame——alert弹窗
from selenium import webdriver driver = webdriver.Firefox() # 指定浏览器驱动 #对象实例化 ----------------------- ...
- Web自动化测试Selenium(4)frame切换/窗口切换/选择框-2021-10-09
1. frame切换 1.1 问题描述 选择 class 属性值为 plant 的元素. elements = wb.find_element_by_css_selector('.plant') 表示 ...
- 【Selenium】切换/窗口切换
文章目录 1 frame切换 1.1 切换到frame 1.2 切回原来的主html 1.3 示例 2 窗口切换 2.1 切换新窗口 2.2 切回原来的窗口 2.3 示例 1 frame切换 1.1 ...
- frame切换、多窗口切换
目标 1. 掌握切换frame的方法 2. 掌握多窗口切换的技巧 frame切换 frame:HTML页面中的一种框架,主要作用是在当前页面中指定区域显示另一页面元素:形式一:[了解] <fra ...
- 自动化测试——多窗口切换和切换frame
这里写目录标题 一.多窗口切换 1.base.py:公共代码 2.切换句柄的方式1,通过for循环 3.切换句柄的方式2,通过索引切换 4.源代码 二.frame窗口 1.什么是frame? 2.Fr ...
- web自动化之frame、文件上传、窗口切换、悬浮菜单
#frame切换 driver.switch_to.frame(driver.find_element('name','iframe1')) driver.find_element('id', 'kw ...
- 4.下拉选择框,弹出框。滚动条,(frame切换、多窗口切换,很重要,常用)等等,面试重要
文章目录 target 下拉选择框 弹出框-- driver.switch_to.alert 滚动条 frame切换-- 重要 多窗口切换 截屏 验证码 cookie target 下拉选择框--se ...
- Python+selenium 自动化-切换窗口页签、切换iframe框架。确定页面是否包含iframe方法。
切换窗口页签: 0是左边第一个,-1是右边第一个. windows = driver.window_handles # 获得所有窗口的句柄 driver.switch_to.window(window ...
最新文章
- NR 5G 密钥与安全详解
- python3练习题:11-20
- SAP HR模块的基础数据表和增强配置
- 网络安全比赛理论答题(四)
- P3 计算机硬件的基本组成
- 13个Pandas实用技巧,有点香 !
- C# 热敏打印机 Socket 网络链接 打印 图片 (二)
- 工作197:判断对象里面是否有0和1
- 第10章 32 位 Intel 微处理器编程架构
- Windows 10 使用 Kali Linux子系统
- HDnoip2017题解
- mysql数据库sql语法_Mysql数据库SQL语句整理
- MongoDB的基本概念与操作
- @Autowired的作用
- 计算机会考ppt考试,信息技术会考Powerpoint复习要点
- Bayesian framework 贝叶斯框架 (R)
- 用java编写国际象棋
- 4.7/4.8 磁盘挂载
- SSH登录及失败解决
- usercity 小程序_微信小程序API 用户信息 wx.getUserInfo(OBJECT)