当前位置: 首页 > news >正文

Selenium-Switch--切换浏览器tab/iframe/alart

Switch

我们在UI自动化测试时,总会出现新建一个tab页面、弹出一个浏览器级别的弹框或者是出现一个iframe标签,这时我们用WebDriver提供的Api接口就无法处理这些情况了。需要用到Selenium单独提供的模块switch_to模块

引用路径

# 第一种方式可以通过直接导入SwitchTo模块来进行操作
from selenium.webdriver.remote.switch_to import SwitchTo
 
# 第二种方式是直接通过Webdriver的switch_to来操作
driver.switch_to

其实webdriver在以前的版本中已经为我们封装好了切换Windows、Alert、Iframe,现在依然可以使用,但是会被打上横线,代表他已经过时了,建议使用SwitchTo类来进行操作。

SwitchToWindows

# 获取浏览器所有的的tab名
tabNames = driver.window_handles
# 切换tab
# driver.switch_to_window(tabNames[1]) 不推荐使用这种方法,最后还是会重复调用switch_to.
# driver导入的类库是SwitchTo
driver.switch_to.window(tabNames[1])  # 切换到新页面

示例:

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('http://ui.imdsx.cn/menu/')
driver.find_element_by_css_selector('a[href="/uitester/"]').click()

js = 'window.scrollTo(0,0);'
driver.execute_script(js)

element = driver.find_element_by_css_selector('a[href="/new-index/"]').click()

# 获取浏览器所有的的tab名
tabNames = driver.window_handles
print(tabNames)
# 输出:['CDwindow-645023DAEF3D7A632EAB9D22408C5F23', 'CDwindow-187B104E8C3062DC086B0D97F3B76B54']

# 获取当前tab名
tabCurrentName = driver.current_window_handle
print(tabCurrentName)
# 输出:CDwindow-645023DAEF3D7A632EAB9D22408C5F23

# 切换tab
# driver.switch_to_window(tabNames[1]) 不推荐使用这种方法,最后还是会重复调用switch_to.
# driver导入的类库是SwitchTo
driver.switch_to.window(tabNames[1])  # 切换到新页面
print(driver.current_window_handle)  # 切换后,当前页面是:CDwindow-187B104E8C3062DC086B0D97F3B76B54

driver.find_element_by_css_selector('#newtag').send_keys('111') # 输入框内输入111
time.sleep(3)
print(driver.title)  # 打印tab名:NewIndex
# driver.close()  # 关闭当前tab页面,分支开关,switch tab时,记住执行close,以免页面开太多,不好识别,最好保持最多2个tab
time.sleep(3)
# 自动退出全部tab,关闭服务,总开关
driver.quit()

补充浏览器相关操作示例:浏览器前进、后退、刷新、获取浏览器大小

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('http://ui.imdsx.cn/uitester')
js = 'window.scrollTo(0,0);'
driver.execute_script(js)
time.sleep(2)

# 浏览器的后退按钮
driver.back()
time.sleep(1)
# 浏览器的前进按钮
driver.forward()
time.sleep(1)
# 浏览器的刷新按钮
driver.refresh()
# 获取当前浏览器大小,返回宽和高
size=driver.get_window_size()
print(size)  # 输出结果:{'width': 945, 'height': 1020}

SwitchToFrame

# SwitchToFrame支持id、name、frame的element
 
# 接受定位到的iframe的Element,这样就可以通过任意一种定位方式进行定位了
frameElement = driver.find_element_by_name('top-frame')
driver.switch_to.frame(frameElement)
 
# 通过fame的name、id属性定位
driver.switch_to.frame('top-frame')
 
# 当存在多层iframe嵌套时,需要一层一层的切换查找,否则将无法找到
driver.switch_to.frame('top-frame')
driver.switch_to.frame('baidu-frame')
 
# 跳转到最外层的页面
driver.switch_to.default_content()
 
# 多层Iframe时,跳转到上一层的iframe中
driver.switch_to.parent_frame()

示例:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('http://ui.imdsx.cn/uitester')
driver.maximize_window() # 最大化窗口
js = 'window.scrollTo(0,0);' # 将屏幕滚动到最上方
driver.execute_script(js)

driver.find_element_by_css_selector('#i1').send_keys('111')

driver.switch_to.frame('top-frame')  # 切换第一层iframe

driver.find_element_by_css_selector('#newtag').send_keys('222')

driver.switch_to.frame('baidu-frame')  # 切换第二层iframe

driver.find_element_by_css_selector('#kw').send_keys('333')

driver.switch_to.parent_frame()  # 回到上一层
driver.find_element_by_css_selector('#newtag').clear()  # 清除文本框内容

# driver.switch_to_default_content() #回到默认层
driver.switch_to.default_content()  # 回到默认层,最外层HTML标签

driver.find_element_by_css_selector('#i1').clear()
1. 代码报错说没有定位到这个元素的问题,排除问题步骤如下:
    a, 当前页面到底有没有这个元素
    b, 你定位的元素是否可以被看到(如页面滚屏、被广告遮挡等)
    c, 是否被其他元素遮挡
    d, 那是否有新的tab生成了 有的话 --》切换tab
    e, 是否有iframe标签,目标元素是否在iframe中,如果有 --》切换iframe
    f, 排除这个元素的父集 有没有宽高

SwitchToAlert

# alert 实际上也是Selenium的一个模块
from selenium.webdriver.common.alert import Alert
 
# 也可以通过Webdriver的switch_to来调用
 
# 点击确认按钮
driver.switch_to.alert.accept()
 
# 如果是确认弹框,相当于点击取消和X按钮
driver.switch_to.alert.dismiss()
 
 
# 如果alert上有文本框时,可以输入文字。(注: 没遇到过)
driver.switch_to.alert.send_keys()
 
# 返回Alert上面的文本内容
text = driver.switch_to.alert.text

例:

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('http://ui.imdsx.cn/uitester')
driver.maximize_window()
js = 'window.scrollTo(0,0);'
driver.execute_script(js)

driver.find_element_by_css_selector('#alert').click() #点击alert元素
time.sleep(2)
driver.switch_to.alert.accept() #点击alart中的确认按钮

driver.find_element_by_css_selector('#confirm').click() #点击confirm元素
time.sleep(2)
# driver.switch_to.alert.accept() #点击alart中的确认按钮
driver.switch_to.alert.dismiss() #点击alart中的取消按钮

text = driver.switch_to.alert.text
print(text) #输出弹框内容:CONFIRM弹框!!

time.sleep(2)
driver.quit()

 

转载于:https://www.cnblogs.com/denise1108/p/10557634.html

相关文章:

  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • JavaScript中in操作符(for..in)、Object.keys()和Object.getOwnPropertyNames()的区别
  • Day01:总结一下str的常见操作吧~
  • Bytom储蓄分红合约解析
  • 软件测试2019:第二次作业
  • 企业应用开发(3)--用户故事
  • CAP的简单理解
  • 2018-2019-2 网络对抗技术 20165320 Exp2 后门原理与实践
  • Chrome 存在数据泄漏问题,谷歌更新说明却没提
  • Flutter (三) Dart 语言基础详解 (异步,生成器,隔离,元数据,注释)
  • 阿里云ECS的1M带宽理解
  • 虚拟机中网络的设置与vim的安装
  • MySQL出现Waiting for table metadata lock的原因以及解决方法
  • 据说是微软面试题,答案让人泪奔==
  • 天梯赛题解 L1-006 连续因子
  • Android 控件背景颜色处理
  • Angularjs之国际化
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Git同步原始仓库到Fork仓库中
  • Making An Indicator With Pure CSS
  • MYSQL 的 IF 函数
  • python docx文档转html页面
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Vue UI框架库开发介绍
  • WebSocket使用
  • Yii源码解读-服务定位器(Service Locator)
  • 好的网址,关于.net 4.0 ,vs 2010
  • 经典排序算法及其 Java 实现
  • 判断客户端类型,Android,iOS,PC
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 如何编写一个可升级的智能合约
  • 深入浅出Node.js
  • 推荐一个React的管理后台框架
  • 优秀架构师必须掌握的架构思维
  • C# - 为值类型重定义相等性
  • !!java web学习笔记(一到五)
  • ###C语言程序设计-----C语言学习(6)#
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (1)虚拟机的安装与使用,linux系统安装
  • (libusb) usb口自动刷新
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (一)认识微服务
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)h264中avc和flv数据的解析
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)VC++中ondraw在什么时候调用的
  • (转)菜鸟学数据库(三)——存储过程
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .net开发引用程序集提示没有强名称的解决办法
  • @font-face 用字体画图标
  • @RestController注解的使用
  • @Valid和@NotNull字段校验使用
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限