selenium Webdriver多窗口切换

应用场景:

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

 

代码如下:

 1 #导包
 2 from selenium import webdriver
 3 from time import sleep
 4 #定义浏览器句柄,打开百度网址
 5 driver=webdriver.Chrome()
 6 driver.implicitly_wait(10)
 7 url="http://www.baidu.com"
 8 driver.get(url)
 9 #窗口最大化
10 driver.maximize_window()
11 #获取百度搜索窗口的句柄
12 seach_windows=driver.current_window_handle
13 #打印百度搜索窗口的句柄
14 print(seach_windows)
15 #点击右上角"登录"按钮
16 driver.find_element_by_link_text("登录").click()
17 #在弹窗中点击"立即注册"按钮
18 driver.find_element_by_xpath('//*[@id="passport-login-pop-dialog"]/div/div/div/div[4]/a').click()
19 #获取当前所有打开窗口的句柄
20 all_handles=driver.window_handles
21 #进入注册窗口
22 for newhandle in all_handles:
23     if newhandle!=seach_windows:
24         driver.switch_to.window(newhandle)
25         print('now register window!')
26         sleep(1)
27         #输入用户名:username12334
28         driver.find_element_by_id("TANGRAM__PSP_4__userName").send_keys("username12334")
29         #输入手机号:18877776666
30         driver.find_element_by_id("TANGRAM__PSP_4__phone").send_keys("18877776666")
31         #输入密码:password
32         driver.find_element_by_id("TANGRAM__PSP_4__password").send_keys("password")
33         #点击获取语音验证码
34         driver.find_element_by_id("TANGRAM__PSP_4__verifyCodeSend").click()
35         #输入验证码:123456
36         driver.find_element_by_id("TANGRAM__PSP_4__verifyCode").send_keys("123456")
37         #勾选(阅读并接受《百度用户协议》及《百度隐私权保护声明》)
38         driver.find_element_by_id("TANGRAM__PSP_4__isAgree").click()
39         #点击"注册"按钮
40         driver.find_element_by_id("TANGRAM__PSP_4__submit").click()
41 #回到百度搜索窗口
42 for newhandle in all_handles:
43     if newhandle==seach_windows:
44         driver.switch_to.window(newhandle)
45         print('now seach window!')
46         sleep(1)
47         #关闭登录/立即注册的弹窗
48         driver.find_element_by_id("TANGRAM__PSP_4__closeBtn").click()
49         #点击百度输入框,输入"selenium webdriver"
50         driver.find_element_by_xpath('//input[@id="kw"]').send_keys("selenium webdriver")
51         #点击"百度一下"按钮
52         driver.find_element_by_xpath('//input[@id="su"]').click()
53         sleep(2)
54 #关闭所有窗口,退出浏览器,结束本次脚本任务
55 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.
 

 

posted @ 2019-08-04 13:56  charseki  阅读(1707)  评论(0编辑  收藏  举报