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

摘要:
切换当我们执行UI自动化测试时,我们总是创建一个新的选项卡页面,弹出一个浏览器级别的弹出框,或显示一个iframe标记。此时,我们无法使用WebDriver提供的Api接口处理这些情况。您需要使用Selenium_to模块参考路径#单独提供的模块开关。第一种方法可以通过直接从Selenium导入SwitchTo模块来操作。webdriver。遥远的切换到合成器

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="http://t.zoukankan.com/uitester/"]').click()

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

element = driver.find_element_by_css_selector('a[href="http://t.zoukankan.com/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()

免责声明:文章转载自《Selenium-Switch--切换浏览器tab/iframe/alart》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇多线程之Nsthread的使用方法cat 查看文件内容下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

css全局格式化

/*全局控制*/ body{margin:0;padding:0;font-size:14px;line-height:22px; height:auto; font-family:"微软雅黑"; color:#3e3938;-webkit-text-size-adjust:none;} body, div, p, h1, h2, h3, h4, h...

点击劫持(click jacking)

什么是点击劫持劫持原理劫持案例代码示例优酷频道刷粉的POC腾讯微博刷粉防御 什么是点击劫持 点击劫持,clickjacking,也被称为UI-覆盖攻击。这个词首次出现在2008年,是由互联网安全专家罗伯特·汉森和耶利米·格劳斯曼首创的。 它是通过覆盖不可见的框架误导受害者点击。 虽然受害者点击的是他所看到的网页,但其实他所点击的是被黑客精心构建...

vue cli 3

介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统 通过 @vue/cli 搭建交互式的项目脚手架。 通过 @vue/cli + @vue/cli-service-global 快速开始零配置原型开发。 一个运行时依赖 (@vue/cli-service) 一个开发环境依赖,局部安装在每个 @vue/cli 创建的项目中。 可升...

CSS背景属性

1、 background-color     背景颜色 2、 background-image    背景图片 3、 Background-repeat    repeat(默认)  |  no-repeat |   repeat-x   |  repeat-y     背景平铺 4 、Background-position  left  |  r...

CSS 表格

CSS 为表格定义了5个专用属性。 一、border-collapse   该属性用于定义表格的行和单元格的边是合并在一起的还是按照标准的 HTML 样式分开的。 语法: border-collapse: separate | collapse   separate:不合并单元格边框 collapse:合并单元格边框...

前端开发代码命名的整理(转)

Div+CSS命名规范 一. 窗体 头:header   内容:content/container   尾:footer   导航:nav   侧栏:sidebar 栏目:column   页面外围控制整体布局宽度:wrapper   左右中:left right center 登录条:loginbar   标志:logo   广告:banner   页面...