应用场景:

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

代码如下:

 #导包
from selenium import webdriver
from time import sleep
#定义浏览器句柄,打开百度网址
driver=webdriver.Chrome()
driver.implicitly_wait(10)
url="http://www.baidu.com"
driver.get(url)
#窗口最大化
driver.maximize_window()
#获取百度搜索窗口的句柄
seach_windows=driver.current_window_handle
#打印百度搜索窗口的句柄
print(seach_windows)
#点击右上角"登录"按钮
driver.find_element_by_link_text("登录").click()
#在弹窗中点击"立即注册"按钮
driver.find_element_by_xpath('//*[@id="passport-login-pop-dialog"]/div/div/div/div[4]/a').click()
#获取当前所有打开窗口的句柄
all_handles=driver.window_handles
#进入注册窗口
for newhandle in all_handles:
if newhandle!=seach_windows:
driver.switch_to.window(newhandle)
print('now register window!')
sleep(1)
#输入用户名:username12334
driver.find_element_by_id("TANGRAM__PSP_4__userName").send_keys("username12334")
#输入手机号:18877776666
driver.find_element_by_id("TANGRAM__PSP_4__phone").send_keys("")
#输入密码:password
driver.find_element_by_id("TANGRAM__PSP_4__password").send_keys("password")
#点击获取语音验证码
driver.find_element_by_id("TANGRAM__PSP_4__verifyCodeSend").click()
#输入验证码:123456
driver.find_element_by_id("TANGRAM__PSP_4__verifyCode").send_keys("")
#勾选(阅读并接受《百度用户协议》及《百度隐私权保护声明》)
driver.find_element_by_id("TANGRAM__PSP_4__isAgree").click()
#点击"注册"按钮
driver.find_element_by_id("TANGRAM__PSP_4__submit").click()
#回到百度搜索窗口
for newhandle in all_handles:
if newhandle==seach_windows:
driver.switch_to.window(newhandle)
print('now seach window!')
sleep(1)
#关闭登录/立即注册的弹窗
driver.find_element_by_id("TANGRAM__PSP_4__closeBtn").click()
#点击百度输入框,输入"selenium webdriver"
driver.find_element_by_xpath('//input[@id="kw"]').send_keys("selenium webdriver")
#点击"百度一下"按钮
driver.find_element_by_xpath('//input[@id="su"]').click()
sleep(2)
#关闭所有窗口,退出浏览器,结束本次脚本任务
driver.quit()
 
脚本执行过程:首先打开百度首页,通过current_window_handle获得当前窗口的句柄,并赋值给变量seach_windows 接着打开登录窗口,在登录弹窗上单击“立即注册”,从而打开新的注册窗口。通过window_handles获取当前打开的所有窗口的句柄,并赋值给变量all_handles 
第一个for循环遍历了all_handles,如果newhandle不等于seach_windows,那么一定是注册窗口,因为脚本执行过程中只打开了两个窗口。所以,通过switch_to.window()切换到注册页面进行注册操作。第二个for循环类似,不过这一次判断如果newhandle等于seach_windows,那么切换到百度搜索页,然后进行搜索操作。
总结:
current_window_handle:获取当前窗口的句柄
window_handles:返回所有窗口的句柄到当前会话
switch_to.window():用于切换到相应的窗口,与switch_to.frame()类似,前者用于不同窗口的切换,后者用于不同表单之间的切换。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
talk is cheap,show me the code.
 

selenium Webdriver多窗口切换的更多相关文章

  1. selenium多个窗口切换

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

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

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

  3. selenium入门14 窗口切换

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

  4. selenium中三大窗口切换

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

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

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

  6. python+selenium之多窗口切换

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

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

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

  8. selenium测试(Java)--多窗口切换(十三)

    selenium测试(Java)--多窗口切换(十三) 如果遇到点击按钮或链接后出现新窗口的情况,就需要使用窗口切换的方法. 本例中就是先打开百度搜索界面,然后利用js打开一个百度新闻界面,然后通过s ...

  9. 【Selenium03篇】python+selenium实现Web自动化:元素三类等待,多窗口切换,警告框处理,下拉框选择

    一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第三篇博 ...

随机推荐

  1. IDEA报错:Could not find resource com/liwen/bean/userMapper.xml

    主要原因设idea无法识别src路径下的xml文件,要把xml文件建立在resources文件下

  2. flume面试题

    1 你是如何实现Flume数据传输的监控的使用第三方框架Ganglia实时监控Flume. 2 Flume的Source,Sink,Channel的作用?你们Source是什么类型?1.作用 (1)S ...

  3. IO多路复用(IO Multiplexing)

    什么是IO多路复用 为什么要有IO多路复用 作者总结 遵循学习新知识的三部曲:是什么?为什么?怎么用? 作者前言:IO多路复用本质上是网络通信过程中的一个技术名词. 什么是IO多路复用 一个用机场管理 ...

  4. 通过带Flask的REST API在Python中部署PyTorch

    在本教程中,我们将使用Flask来部署PyTorch模型,并用讲解用于模型推断的 REST API.特别是,我们将部署一个预训练的DenseNet 121模 型来检测图像. 备注: 可在GitHub上 ...

  5. UVA11987 Almost Union-Find 并查集的节点删除

    题意: 第一行给出一个n,m,表示 n个集合,里面的元素为1~n,下面有m种操作,第一个数为 1 时,输入a,b 表示a,b 两个集合合并到一起,第一个数为 2 时,输入a,b表示将 a 从他原来的集 ...

  6. 常见Web安全漏洞--------防盗链

    1,防盗链防止盗用自己服务上的东西... 2,XSS服务上有这么一张图: <!DOCTYPE html> <html> <head lang="en" ...

  7. mac 根目录下新建文件夹并赋予权限

    在根目录中,你会发现你无法创建文件夹,即使使用命令也无法创建目录: 1.修改auto_master 编译 /etc/auto_master 文件,注释掉或者移除以 /home 开头的那一行,保存. 终 ...

  8. 安装 MySQL 过程记录

    最近安装 MySQL 时 遇到了许多问题,记录一下安装过程以及遇到的问题. 第一步:在官网上下载适合自己版本的 MySQL,我选择的是 Windows 64 位免安装版的:    官网地址:https ...

  9. linux 访问windows 共享文件

    用到的方法是 CIFS (Common Internet File System)windows自己的网络文件系统 操作系统: Linux为 debian. Windows 为 windows 8   ...

  10. C 电压

      时间限制 : 10000 MS   空间限制 : - KB  评测说明 : 1s,256m 问题描述 JOI社的某个实验室中有着复杂的电路.电路由n个节点和m根细长的电阻组成.节点被标号为1~N ...