应用场景:
在页面操作过程中有时候点击某个链接会弹出新的窗口,这时候就需要主机切换到新打开的窗口上进行操作。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.
来源:oschina
链接:https://my.oschina.net/u/4336234/blog/3441019