【WebDriver API】python之selenium多窗口切换

 ̄綄美尐妖づ 提交于 2020-01-16 04:10:23

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

以百度首页和百度注册页为例,在两个窗口之间的切换。

多窗口切换1.py

# coding=utf-8
from selenium import webdriver
import time

# 访问百度
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
# 获取百度搜索窗口句柄
search_windows = driver.current_window_handle
driver.find_element_by_xpath('/html/body/div[1]/div[1]/div/div[3]/a[7]').click()
time.sleep(3)
driver.find_element_by_xpath('/html/body/div[4]/div[2]/div[2]/div/div/div/div/div/div[3]/a').click()

# 获取打开所有窗口句柄
all_handles = driver.window_handles
# 进入注册窗口
for handle in all_handles:
    if handle != search_windows:
        driver.switch_to_window(handle)
        print("now regester window")
        driver.find_element_by_id('TANGRAM__PSP_4__userName').send_keys('namejianjain')
        time.sleep(3)
for handle in all_handles:
    if handle == search_windows:
        driver.switch_to_window(handle)
        print("now search window")
        time.sleep(3)
        driver.find_element_by_id("TANGRAM__PSP_4__closeBtn").click()
        time.sleep(3)
        driver.find_element_by_id('kw').send_keys('selenium')
        driver.find_element_by_id('su').click()
        time.sleep(5)

driver.close()

脚本执行过程:首先打开百度首页,通过current_window_handle获得当前窗口的句柄,并赋值给变量sreach_handle。接着打开登陆弹窗,在登陆弹窗上单击“立即注册”,从而打开新的注册窗口。通过window_handles获得当前打开的所有窗口的句柄,并赋值给变量all_handles。

第一个循环遍历all_handles,如果handle不等于sreach_handle,那么一定是注册窗口,因为脚本执行过程中只打开了两个窗口。所以,通过switch_to.window()切换到注册页进行注册操作。第二个循环类似,不过这一次判断如果handle等于sreach_handle,那么切换到百度搜索页,然后进行搜索操作。

在本例中所涉及的新方法如下:

current_window_handle:获得当前窗口句柄

window_handles:返回所有窗口的句柄到当前会话。

switch_to_window():用于切换到相应的窗口,与上一节的switch_to.frame()类似,前者用于不同窗口的切换,后者用于不同表单之间的切换。

 

多窗口切换2.py

import time
from selenium import webdriver

driver = webdriver.Firefox()
driver.maximize_window()  # 窗口最大化
driver.get('https://www.baidu.com')  # 在当前浏览器中访问百度
# 新开一个窗口,通过执行new一个窗口
new = 'window.open("https://www.sogou.com");'
driver.execute_script(new)

print(driver.current_window_handle)  # 输出当前窗口句柄(百度)
handles = driver.window_handles  # 获取当前窗口句柄集合(列表类型)
print(handles)  # 输出句柄集合

for handle in handles:  # 切换窗口(切换到搜狗)
    if handle != driver.current_window_handle:
        print('switch to ', handle)
        driver.switch_to.window(handle)
        print(driver.current_window_handle)  # 输出当前窗口句柄(搜狗)
        break

time.sleep(2)
driver.close()  # 关闭当前窗口(搜狗)
time.sleep(2)
driver.switch_to.window(handles[0])  # 切换回百度窗口

多窗口的网页标签句柄

handles=driver.window_handles #获取所有网页标签的窗口句柄,以列表形式保存
handles[-1] #表示取得最新打开的标签页的窗口句柄
handle=drvier.current_window_handle #获取当前页的标签页的窗口句柄
driver.switch_to.window(driver.window_handles[-1]) #切换到最新的窗口句柄


例子1的另一种写法:

# coding=utf-8
from selenium import webdriver
import time

# 访问百度
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
# 获取百度搜索窗口句柄
search_windows = driver.current_window_handle
driver.find_element_by_xpath('/html/body/div[1]/div[1]/div/div[3]/a[7]').click()
time.sleep(3)
driver.find_element_by_xpath('/html/body/div[4]/div[2]/div[2]/div/div/div/div/div/div[3]/a').click()

# 获取打开所有窗口句柄
all_handles = driver.window_handles
# 进入注册窗口
for handle in all_handles:
    if handle != search_windows:
        driver.switch_to_window(all_handles[1])#切换到第二个窗口的句柄
        print("now regester window")
        driver.find_element_by_id('TANGRAM__PSP_4__userName').send_keys('namejianjain')
        time.sleep(3)
for handle in all_handles:
    if handle == search_windows:
        driver.switch_to_window(all_handles[0]) #切换回主页句柄
        print("now search window")
        time.sleep(3)
        driver.find_element_by_id("TANGRAM__PSP_4__closeBtn").click()
        time.sleep(3)
        driver.find_element_by_id('kw').send_keys('selenium')
        driver.find_element_by_id('su').click()
        time.sleep(5)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!