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
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('') driver.switch_to.frame('top-frame') # 切换第一层iframe driver.find_element_by_css_selector('#newtag').send_keys('') driver.switch_to.frame('baidu-frame') # 切换第二层iframe driver.find_element_by_css_selector('#kw').send_keys('') 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的更多相关文章

  1. Puppeteer笔记(七):Puppeteer切换浏览器TAB页

    一.Puppeteer切换浏览器TAB页 1.browser.pages() 二.上手实例Demo 功能测试:打开www.ly.com首页,定位搜索"苏州",获取新打开页面上的搜索 ...

  2. selenium中切换浏览器不同tab 的操作

    from selenium import webdriverimport timedriver=webdriver.Chrome()driver.get('http://ui.imdsx.cn/uit ...

  3. 监听浏览器tab切换

    监听浏览器切屏 为了完成验证用户在切换浏览器tab时进行登录再次认证需求需要监听浏览器切换窗口 if (document.hidden !== undefined) { document.addEve ...

  4. selenium WebDriver 对浏览器标签页的切换

    关于selenium WebDriver 对浏览器标签页的切换,现在的市面上最新的浏览器,当点击一个链接打开一个新的页面都是在浏览器中打开一个标签页,而selenium只能对窗口进行切换的方法,只能操 ...

  5. selenium之 定位以及切换frame(iframe)

    Set<String> windows = driver.getWindowHandles();        int count = 0;        for(String handl ...

  6. js监听浏览器tab窗口切换

    js监听浏览器tab窗口切换 ——IT唐伯虎 摘要:js监听浏览器tab窗口切换. if (document.hidden !== undefined) {  document.addEventLis ...

  7. Selenium WebDriver-获取与切换浏览器窗口的句柄

    通过selenium webdriver去切换浏览器的窗口,需要通过句柄,具体代码如下: #encoding=utf-8 import unittest import time import char ...

  8. 监听浏览器tab选项卡选中事件,点击浏览器tab标签页回调事件,浏览器tab切换监听事件

    js事件注册代码: <script> document.addEventListener('visibilitychange',function(){ //浏览器tab切换监听事件 if( ...

  9. Selenium - Switch & Select Api

    一.多表单切换  driver.switch_to.frame() iframe  :直接将一个html 页面嵌入另一个html 页面中 switch_to.frame() 默认可以直接取表单的id ...

随机推荐

  1. UVA11419 SAM I AM

    UVA11419 SAM I AM 给定一个 \(R\times C\) 的矩阵中的 \(N\) 个点,求最少选取多少个行或列才能使得每个给出的点都被一行或一列覆盖,输出方案 \(R,\ C\leq1 ...

  2. LoRa---她的芯片和她的几种工作模式

    LoRa对应的芯片------sx1278芯片 sx1278芯片为Semtech公司推出的具有新型LoRa扩频技术的RF芯片,具有功耗低.容量大.传输距离远.抗干扰能力强的优点.我接下来在这块芯片上进 ...

  3. 转载:教你分分钟搞定Docker私有仓库Registry

    一.什么是Docker私有仓库Registry 官方的Docker hub是一个用于管理公共镜像的好地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去.但是,有时候我们的服务器无法 ...

  4. day11(函数参数,函数对象,打散机制,函数嵌套调用)

    一,复习 # 什么是函数:具体特定功能的代码块 - 特定功能代码块作为一个整体,并给该整体命名,就是函数 # 函数的优点: # 1.减少代码的冗余 # 2.结构清晰,可读性强 # 3.具有复用性,开发 ...

  5. C++购书系统

    C++购书系统——来自班里某位同学的小学期作业 这是一个购书系统,模拟网上购书的流程.用户可以在这个小程序里输入对应的数字进行浏览书籍信息,查看用户信息,查找书籍,购买书籍以及查询个人订单的操作. 以 ...

  6. java集合-HashSet源码解析

    HashSet 无序集合类 实现了Set接口 内部通过HashMap实现 // HashSet public class HashSet<E> extends AbstractSet< ...

  7. Index-技术学习系列博客

    计算机理论基础系列 B树的插入操作 前端系列 安装nodejs和webpack环境 构建vue项目 Json Web Token VO和DO转换(一) 工具汇总 缓存的实现和使用 框架学习系列 shi ...

  8. To B Vs To C

    谈谈 To B 业务的难点https://tangjie.me/blog/259.html

  9. Android技术文章收集

    Android高工必备技能! 我的 Android 开发实战经验总结 Android开发在路上:少去踩坑,多走捷径 //微信 微信Android客户端架构演进之路 微信Android版智能心跳方案 / ...

  10. b树和hash树的应用场景

    关系型数据库中,索引大多采用B/B+树来作为存储结构,而全文搜索引擎的索引则主要采用hash的存储结构,这两种数据结构有什么区别?       如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经 ...