应用场景:

在页面操作过程中有时候点击某个链接会弹出新的窗口,这时候就需要主机切换到新打开的窗口上进行操作。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. [最短路,floyd] Codeforces 1204C Anna, Svyatoslav and Maps

    题目:http://codeforces.com/contest/1204/problem/C C. Anna, Svyatoslav and Maps time limit per test 2 s ...

  2. ubuntu 18.04下virtualbox安装windows虚拟机+增强功能+secureCRT

    先强调一下,我是在Ubuntu里安装windows虚拟机,如果要看如何安装linux虚拟机的话,那么你走错地方了. 我一直使用Linux系统做开发的,选择Ubuntu是因为多数常用软件对Ubuntu支 ...

  3. JUnit 5基础指南

    A Guide to JUnit 5 准备 添加maven依赖: <dependency> <groupId>org.junit.jupiter</groupId> ...

  4. CentOS7 部署 Hadoop 3.2.1 (伪分布式)

    CentOS: Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 ...

  5. 记录一些服务端术语和搭建web服务器

    菜单快捷导航 服务端常用术语 搭建web服务器和配置虚拟主机 记录一些服务端方面的常用术语 1.CS架构和BS架构 1.1 CS架构 CS(Client/Server),基于安装包类型的桌面或手机软件 ...

  6. SubLime Text3 常用插件总结

    近来开始恶补前端知识,在一定的技能基础上,逐渐开始进阶的学习和使用.因此在这里罗列下,SubLime Text3 常用插件: 1.Emmet 提高HTML & CSS3编写速度. 2.Them ...

  7. python中的原地操作

    什么是原地操作: 例子: 列表在append添加一个元素后,没有产生新副本,再次打印的时候多了一个值,这个appned就是原地操作 由此可见,原地操作有以下特点: 没有返回值(返回值为None) 改变 ...

  8. SpringBoot环境搭建及第一个程序运行(详细!)

    spring boot简介 spring boot框架抛弃了繁琐的xml配置过程,采用大量的默认配置简化我们的开发过程. 所以采用Spring boot可以非常容易和快速地创建基于Spring 框架的 ...

  9. Linux下使用FastDFS

    本文所有操作均在CentOS 7.x环境下进行. 1.1.单节点FastDFS 整个安装过程非常复杂,很容易出错,建议进行多次备份. 我们这里不打算安装多台虚拟机,因此会把tracker和storag ...

  10. 树莓派中Docker部署.Net Core 3.1 (一)

    一.背景 受疫情影响,已经在家强制事假一个月了,除了刷简历外就是在家学习,闲来无事,最近买了几个树莓派4B的板子回来,准备用树莓派搭建个自动部署的平台和微服务示例,长话短说,节约时间,直接进入正题吧 ...