我们在做UI自动化时,不得不会遇到一些窗口跳转与弹框,在这种的时候如果不进行切换的话,继续执行脚本必然会报错,所以我们就需要用到切换窗口的方法。

selenium中主要是三种窗口

  •   Windows窗口
  •   iframe窗口
  •   alert窗口

1、Windows窗口

  这类窗口也就是我们常说的句柄,句柄的切换是有必要的,我们自己手动在网页上从操作的话,产生新的句柄时浏览器会自动的帮我们跳转到最新的句柄处,但是我们在做UI自动化的时候,代码并不会帮我们自动的切换到最新的句柄,需要我们使用代码去进行切换    

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element(By.ID, "kw").send_keys("腾讯课堂")
driver.find_element(By.ID, "kw").send_keys(Keys.ENTER)
loc = (By.XPATH, '//div[@id="1"]//h3[@class="t"]//em')
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(loc))
driver.find_element(*loc).click()

以上的代码脚本,就会产生一个新的Windows窗口,如图:

我们如果直接去执行下一步操作的话,会报错的,所以我们需要先跳转到新的窗口才行

需要加上以下代码:

windows = driver.window_handles   # 获取该会话所有的句柄
driver.switch_to.window(windows[-1]) # 跳转到最新的句柄

然后我们就可以在这个窗口里面进行新的操作了

2、iframe窗口

  iframe窗口是嵌套在我们整个HTML里面的一个HTML的页面,我们如果要对这个iframe中的元素进行操作,那么久必须要先跳转至这个iframe窗口才可以进行该操作,不然就会导致报错

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element(By.ID, "kw").send_keys("腾讯课堂")
driver.find_element(By.ID, "kw").send_keys(Keys.ENTER)
loc = (By.XPATH, '//div[@id="1"]//h3[@class="t"]//em')
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(loc))
driver.find_element(*loc).click()
windows = driver.window_handles # 获取该会话所有的句柄
driver.switch_to.window(windows[-1]) # 跳转到最新的句柄
first_login = (By.XPATH, '//a[@class="mod-header__link-login js-login-op"]') # 腾讯课堂首页登录按钮
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(first_login)) # 显性等待到登录按钮加载出来,没隔0.5检查一共10秒
# 显性等待首页中的登录按钮是否存在
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(first_login))
# 点击登录按钮
driver.find_element(*first_login).click()
# 显性等待用qq登录是否存在
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(
(By.XPATH,
'//a[@class="js-btns-enter btns-enter btns-enter-qq"]')))
driver.find_element(By.XPATH, '//a[@class="js-btns-enter btns-enter btns-enter-qq"]').click()
# 显性等待账号密码登录
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(
(By.XPATH, '//a[@id="switcher_plogin"]')
))
driver.find_element(By.XPATH, '//a[@id="switcher_plogin"]').click()

以上代码,执行的话就会报错,这是因为啥呢?

仔细研究下,发现是因为我们最后查找的元素是属于iframe窗口的

 

所以需要我们在查找此元素之前就要跳转到iframe窗口才可以找到该元素,也就不会报错了,请看以下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element(By.ID, "kw").send_keys("腾讯课堂")
driver.find_element(By.ID, "kw").send_keys(Keys.ENTER)
loc = (By.XPATH, '//div[@id="1"]//h3[@class="t"]//em')
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(loc))
driver.find_element(*loc).click()
windows = driver.window_handles # 获取该会话所有的句柄
driver.switch_to.window(windows[-1]) # 跳转到最新的句柄
first_login = (By.XPATH, '//a[@class="mod-header__link-login js-login-op"]') # 腾讯课堂首页登录按钮
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(first_login)) # 显性等待到登录按钮加载出来,没隔0.5检查一共10秒
# 显性等待首页中的登录按钮是否存在
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(first_login))
# 点击登录按钮
driver.find_element(*first_login).click()
# 显性等待用qq登录是否存在
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(
(By.XPATH,
'//a[@class="js-btns-enter btns-enter btns-enter-qq"]')))
driver.find_element(By.XPATH, '//a[@class="js-btns-enter btns-enter btns-enter-qq"]').click()
# 跳转到iframe窗口
driver.switch_to.frame('login_frame_qq')
# 显性等待账号密码登录
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(
(By.XPATH, '//a[@id="switcher_plogin"]')
))
driver.find_element(By.XPATH, '//a[@id="switcher_plogin"]').click()

上面红色加粗代码就是我们加上的代码,参数的话可以有多种格式,我这里传递的参数时iframe的name值,有人可能会问:如果这个name值在这个HTML里面有多个name值呢?那我该咋办?

其实driver.switch_to.frame(value)中这个value值不光可以填写iframe的name值,还可以填写整个HTML中所有iframe的索引值(比如:整个HTML有5个iframe,我可以输入0-4的索引值来选择我需要的iframe),还可以是这个元素对象(可以通过该iframe的其他属性:比如id、class等元素定位方式来查找)

在我们对这个iframe操作结束后,我们还是需要回到默认的页面去的,这个时候selenium也给我提供了一步到位的操作

driver.switch_to.default_content()

这行代码就可以回到我们本次会话的最开始的页面

3、alert窗口

  alert窗口就是Windows窗口弹出的提示框,在有这个提示框的作用下,我们是不能做其他的任何操作的,必须要将这个alert弹框给删除掉才可以进行其他操作

selenium中提供了操作

driver.switch_to.alert.accept()  # 确定操作
driver.switch_to.alert.dismiss() # 取消操作
driver.switch_to.alert.send_keys("") # alert弹框输入文本
driver.switch_to.alert.text() # 获取alert的文本内容

今天主要总结的是三大弹框操作,总结的不到位的欢迎各位进行评论交流哈,,

selenium中三大窗口切换的更多相关文章

  1. 使用python处理selenium中的窗口切换问题

    # 获取当前页面的句柄 ch = self.driver.current_window_handle # 获取所有句柄 ah = self.driver.window_handles # 切换句柄 s ...

  2. selenium多个窗口切换

    浏览器里面支持多窗口打开,例如这样: html里面写了: target="_blank" 造成新打开一个窗口,但是selenium不会自动跳转到新的串口,需要自己切换: # 你打开 ...

  3. selenium入门14 窗口切换

    窗口切换: 当前窗口句柄 current_window_handle 所有的窗口句柄 window_handles 切换窗口 switch_to_window() #coding=utf-8 #切换窗 ...

  4. Selenium:多窗口切换(获取窗口句柄handle)

    我们在操作网页的时候,点击有些页面的链接,会重新打开一个窗口,我们要在新页面上操作,就得切换窗口 比如在百度首页的登录框点击注册,会重新打开一个注册的新页面,要在新页面注册,就得先切进新页面 那我们怎 ...

  5. eclipse中的窗口切换快捷键

    Ctrl+Shift+F6 很简单,如果以后改用IDEA的话就没用了,但这个窗口切换确实很复杂,看起来也操作比较快.

  6. selenium Webdriver多窗口切换

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

  7. selenium操作浏览器-窗口切换

    package seleniumLearn1; import java.util.Set; import java.util.concurrent.TimeUnit; import org.openq ...

  8. selenium中iframe的切换

    #第一层是默认层, 第二层是新建标签的层,第三层是百度的那层from selenium import webdriverimport timedriver=webdriver.Chrome()driv ...

  9. python+selenium之多窗口切换

    #打开浏览器driver = webdriver.Firefox()driver.get(url)#获取当前窗口now_handle=driver.current_window_handle # 获取 ...

随机推荐

  1. ESP8266 LUA脚本语言开发: 准备工作-LUA文件加载与变量调用

    前言 这节说一下多个文件调用 多个文件之间变量调用 准备两个文件 init.lua other.lua 开始 模块默认一开始调用的是init.lua 咱让init.lua调用 other.lua 很简 ...

  2. 【LG1600】[NOIP2016]天天爱跑步

    [LG1600][NOIP2016]天天爱跑步 题面 洛谷 题解 考虑一条路径\(S\rightarrow T\)是如何给一个观测点\(x\)造成贡献的, 一种是从\(x\)的子树内出来,另外一种是从 ...

  3. C++中二分法之upper_bound()、lower_bound、binary_search()函数

    前言 数组.容器vector都适用,在头文件"algorithm"中 下面的例子是针对容器的,注意返回的是距离元素3最近的指针it,输出的是*it结果为元素4,假如我想得到位置而非 ...

  4. 深入学习 esp8266 wifimanager源码解析(打造专属自己的web配网)

    QQ技术互动交流群:ESP8266&32 物联网开发 群号622368884,不喜勿喷 单片机菜鸟博哥CSDN 1.前言 废话少说,本篇博文的目的就是深入学习 WifiManager 这个gi ...

  5. Supervisor-守护进程工具

    前言 手头上的服务器程序1.0版本终于要进入线上测试阶段了

  6. SpringBoot第四篇:整合JDBCTemplate

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10868954.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言   前面几篇文 ...

  7. 联合CRF和字典学习的自顶向下的视觉显著性-全文解读

    top-down visual saliency via joint CRF anddictionary learning 自顶向下的视觉显著性是使用目标对象的可判别表示和一个降低搜索空间的概率图来进 ...

  8. 《Interest Rate Risk Modeling》阅读笔记——第二章:债券价格、久期与凸性

    目录 第二章:债券价格.久期与凸性 思维导图 瞬时回报率-收益率的例子 第二章:债券价格.久期与凸性 思维导图 瞬时回报率-收益率的例子

  9. 使用spring jpa hibernate框架时报错:javax.validation.UnexpectedTypeException: HV000030

    错误信息: [#%&*^]20190521121942:497.!react:all.,RctJobExecutor-1#D9AA5167921A464CA9DDA14943545426%NA ...

  10. struts2被淘汰的原因

    Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个Servlet.在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互.Struts2 ...