在web应用自动化测试中,点击一个链接或者按钮会打开一个新的浏览器窗口,会出现多个窗口实例。默认情况下的焦点在主窗口(父窗口),如果要对子窗口进行操作,就需要首先切换到子窗口。

Selenium WebDriver给每个窗口指定了一个唯一的ID,Selenium通过这个唯一ID实现在多个窗口之间切换。常见的有iframe,弹出对话框alert,新窗口等。本文将介绍这几种窗口的切换。

iframe切换

在web自动化中,如果一个元素定位始终不到,如果locator没有写错,很大概率就是这个元素在iframe中。

什么是frame?

frame是html中的框架,通过使用frameset 标签将页面进行垂直或者水平分离。包含frameset、frame、 iframe三种标签。

演示代码:https://www.w3school.com.cn/tiy/t.asp?f=html_frame_cols

frame切换

切换到frame或者iframe后就可以进行操作,操作完成后需要切换回原来的框架:

driver.switch_to.frame() #根据元素id或 index切换
driver.switch_to.default_content() #切换到默认 frame
driver.switch_to.parent_frame() #切换到父级 frame

多 frame切换

测试页面:https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable

切换iframe,打印'请拖拽我'元素文本

def test_iframe(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("draggable").text) # 打印'请拖拽我'
      # self.driver.switch_to.parent_frame()
      self.driver.switch_to.default_content()
      print(self.driver.find_element_by_id("submitBTN").text) #点击运行

弹出对话框alert切换

在页面操作时会遇到 JavaScript所生成的alert、 confirm以及prompt弹框,需要对弹框操作后才能进行下一步。

操作alert常用的方法

  1. switch_to.alert():切换到当前页面上的警告框
  2. text:返回弹框文本信息
  3. accept():接受弹框,确认
  4. dismiss():取消弹框
  5. send_keys(keysToSend):发送文本至弹框

alert切换

测试页面还是上面的页面,拖拽后会出现一个弹框,我们打印弹框内容并点击确定。

python代码:

def test_alert(self):
      self.driver.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
      self.driver.switch_to.frame("iframeResult")
      drag = self.driver.find_element_by_id("draggable")
      drop = self.driver.find_element_by_id("droppable")
      action = ActionChains(self.driver)
      action.drag_and_drop(drag, drop).perform()
      sleep(2)
      alert = self.driver.switch_to.alert
      print(alert.text)
      alert.accept()
      # self.driver.switch_to.alert.accept()
      self.driver.switch_to.default_content()
      self.driver.find_element_by_id("submitBTN").click()
      sleep(3)

多窗口切换

有时候点击某些链接会打开一个新的窗口,需要先切换窗口才能在新页面上操作。selenium通过切换窗口句柄来进行多个窗口之间的切换。

处理流程

  1. 获取当前的窗口句柄(driver.current_window_handle)
  2. 获取当前会话下的所有窗口句柄(driver.window_handles)
  3. 切换窗口(driver.switch_to_window)
  4. 切回原窗口(driver.switch_to_window)

多窗口切换

1、打开百度,点击登录,进入注册界面,返回登录页

python代码:

def test_window(self):
      self.driver.get("http://www.baidu.com")
      self.driver.find_element_by_link_text("登录").click()
      # print(self.driver.current_window_handle) # 当前的窗口句柄
      self. driver.find_element_by_link_text("立即注册").click()
      windows = self.driver.window_handles # 所有窗口句柄       # 切换到注册窗口
      self.driver.switch_to.window(windows[-1])
      self.driver.find_element_by_id("TANGRAM__PSP_4__userName").send_keys("username")
      self.driver.find_element_by_id("TANGRAM__PSP_4__phone").send_keys("12345678")
      sleep(2)       # 切换回登录窗口
      self.driver.switch_to.window(windows[0])
      self.driver.find_element_by_id("TANGRAM__PSP_10__footerULoginBtn").click()

2、打开新窗口

def test_window2(self):
self.driver.get("http://www.baidu.com")
js = "window.open('http://www.sogou.com')"
self.driver.execute_script(js)
sleep(3)
windows = self.driver.window_handles
print(windows)
# 切换到新打开的窗口
self.driver.switch_to.window(windows[-1])
self.driver.find_element_by_id("query").send_keys("test sogou") # 搜狗搜索框
sleep(3)
self.driver.close() # 关闭新打开的窗口
# 切回窗口
self.driver.switch_to.window(windows[0])
self.driver.find_element_by_id("kw").send_keys("test baidu") # 百度搜索框
sleep(3)

获取当前焦点元素

switch_to还有一个方法叫switch_to.active_element,返回当前焦点的WebElement对象,用于判断当前焦点是否位于某个web元素。有时候需要测试打开一个网页,焦点是否在输入框,比如账号密码登录页面。

测试:打开https://www.baidu.com/,焦点在输入框

python代码:

def test_element_focus(self):
    self.driver.get("https://www.baidu.com/")
    baidu = self.driver.find_element_by_id("kw")
    assert baidu == self.driver.switch_to.active_element

--THE END--

文章标题:Selenium switch_to方法

本文作者:hiyo

本文链接:https://hiyong.gitee.io/posts/selenium-switch_to/

欢迎关注公众号:「测试开发小记」及时接收最新技术文章!

Selenium switch_to方法的更多相关文章

  1. python+selenium安装方法

    一.准备工具: 下载 python[python 开发环境] http://python.org/getit/ 下载 setuptools [python 的基础包工具] http://pypi.py ...

  2. Java&Selenium截图方法封装

    Java&Selenium截图方法封装 package util; import org.apache.commons.io.FileUtils; import org.openqa.sele ...

  3. selenium定位方法实例

    selenium定位方法实例 首先打开浏览器输入微博的网址,将网页最大化,等待3秒 from selenium import webdriver import time driver = webdri ...

  4. selenium定位方法(二)

    selenium定位方法(二)  1.xpath定位:xpath是在XML中查找节点所在的路径的表达式 1)绝对路径的Xpath表达式 例:/html/body/div/div[1]/ul//li[3 ...

  5. selenium定位方法(一)

    selenium定位方法-(一) 1.定位页面元素的方式(By类的方法) 1)id定位:通过页面元素的id属性值来定位一个页面元素       注意事项:如果每次刷新网页之后元素的id属性值都不同,说 ...

  6. selenium - switch_to.window() - 多窗口切换

    在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要主机切换到新打开的窗口上进行操作.WebDriver提供了switch_to.window()方法,可以实现在不同的窗口之间切换. 以百度首 ...

  7. selenium - switch_to.frame()- 内嵌表单的切换

    表单嵌套frame/iframe webDriver只能在一个页面上对元素识别和定位,对于frame/iframe表单内嵌页面上的元素无法直接定位,此时就需要通过switch_to.frame()方法 ...

  8. Selenium使用方法整理

    我采用的是Python来使用selenium库,同时java也可以使用,但不如python操作起来方便.下文都会以python的操作为例子,整理我学习selenium过程中收集到的方法. 一:安装 首 ...

  9. python环境安装selenium和手动下载安装selenium的方法

    方法1:cmd环境下,用pip install selenium 可能会很慢 方法2:下载selenium安装包手动安装 下载地址:https://pypi.org/project/selenium/ ...

随机推荐

  1. C语言常用的一些转换工具函数!

    1.字符串转十六进制 代码实现: 2.十六进制转字符串 代码实现: 或者 效果:十六进制:0x13 0xAA 0x02转为字符串:"13AAA2" 3.字符串转十进制 代码实现: ...

  2. Git基本操作(一)

    Git 使用(一) - git init 初始化仓库 - git status 仓库状态 - git add filename 单个文件加入暂存 - git add. 全部加入暂存 - git com ...

  3. Elasticsearch基本CURD操作语法讲解

    当我们的ES集群搭建完成以后,我怎么能看到集群中各个节点状态以及主节点和健康情况呢,如下讲解使用curl命令来与ES集群进行交互.分别有查询主节点情况.集群状态.以及创建索引查看索引.查看分片以及对E ...

  4. 区块链学习5:智能合约Smart contract原理及发展历程科普知识

    ☞ ░ 前往老猿Python博文目录 ░ 一.智能合约的定义 通俗来说,智能合约就是一种在计算机系统上,当一定条件满足的情况下可被自动执行的合约,智能合约体现为一段代码及其运行环境.例如银行信用卡的自 ...

  5. PyQt(Python+Qt)学习随笔:模式窗口的windowModality属性与modal属性

    windowModality属性 windowModality属性只对窗口对象有效,保存的是哪些类型的窗口被模式窗口阻塞. 模式窗口防止其他窗口中的部件获取输入.此属性的值控制对应窗口可见时阻塞哪些类 ...

  6. 关于EF框架EntityState的几种状态

    在使用EF框架时,我们通常都是通过调用SaveChanges方法把增加/修改/删除的数据提交到数据库,但是上下文是如何知道实体对象是增加.修改还是删除呢?答案是通过EntityState的枚举值来判断 ...

  7. Day1 【Scrum 冲刺博客】

    (因发作业当天没注意看作业内容,第一天的冲刺博客和第二天的同时发!!!不好意思!!!) 各个成员在 Alpha 阶段认领的任务 方晓莹 搭建社区管理系统的前端框架 登录页开发 管理员模块个人中心开发 ...

  8. 熊猫全球站视点关注,韩国投入47亿韩元开发区块链等ICT技术

    韩国科学技术信息通信部评选出18个包括区块链项目在内的政府扶持项目,为信息通信(ICT)创新企业提供技术开发支持. 熊猫全球站获悉,韩国政府计划分期选拔第一阶段(前期策划阶段3个月)和第二阶段(技术开 ...

  9. Panda 交易所热点关注:股权交易中心+区块链试点将开始

    近期,Panda 交易所注意到,中国证监会已同意北京.上海等5家区域性股权市场参与区块链建设试点工作.Panda 交易所获悉的具体情况是,北京股权交易中心曾联合其他单位共同推出区域性股权市场中介机构征 ...

  10. linux 设置别名

    [root@oldboyedu45-xy data]# alias(查找别名) alias cp='cp -i' alias l.='ls -d .* --color=auto' alias ll=' ...