selenium 窗口切换

前期准备

from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 创建Chrome浏览器对象
chrome_options = webdriver.ChromeOptions()
# 隐藏正受到自动测试软件的控制。
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = webdriver.Chrome(options=chrome_options)
driver.implicitly_wait(30)
driver.get('https://www.baidu.com')
driver.maximize_window()

 

一般情况:(这种方法只限两个窗口的,如果是3个以上窗口,就会很麻烦不推荐)

1.获取当前窗口的句柄:

current_window_handle = driver.current_window_handle

2.获取所有窗口的句柄:

window_handles = driver.window_handles

3.便利所有窗口句柄,切换到目标窗口:

for window_handle in window_handles:
    if window_handle != current_window_handle:
        driver.switch_to.window(window_handle)
        break

依次遍历所有窗口句柄,如果找到与当前窗口句柄不同的窗口,则切换到该窗口并跳出循环。

多窗口(3个及以上):

前提是你要知道多个窗口的title。 

for window_handle in window_handles:
    driver.switch_to.window(window_handle)
    if driver.title == "My Target Window":
        break

通过 title 快速的切换到对应窗口

示例:

from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 创建Chrome浏览器对象
chrome_options = webdriver.ChromeOptions()
# 隐藏正受到自动测试软件的控制。
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = webdriver.Chrome(options=chrome_options)
driver.implicitly_wait(30)
driver.get('https://www.baidu.com')
driver.maximize_window()

print(driver.current_window_handle)

driver.find_element(By.LINK_TEXT, "新闻").click()
window_handles = driver.window_handles
for window_handle in window_handles:
    driver.switch_to.window(window_handle)
    if driver.title == '百度新闻——海量中文资讯平台':
        break
print('我是新闻', driver.current_window_handle)
driver.find_element(By.ID, 'ww').send_keys('你好')  # 操作新闻界面的输入框,测试操作句柄是否切换到新闻这个界面。如果没有切换到就会报错
sleep(2)
# 在百度首页点击 视频,打开百度视频
driver.find_element(By.LINK_TEXT, "视频").click()
window_handles = driver.window_handles
for window_handle in window_handles:
    driver.switch_to.window(window_handle)
    if driver.title == '百搜视频——业界领先的中文视频搜索引擎之一':
        break
print('我是视频', driver.current_window_handle)
# driver.find_element(By.XPATH, '//input[@type="submit"]').click()
print(driver.window_handles)
sleep(2)
# 关闭这个标签页
driver.close()

for window_handle in window_handles:
    driver.switch_to.window(window_handle)
    if driver.title == '你好_百度视频搜索':
        break
driver.close()

print(driver.window_handles)
sleep(2)
# 关闭浏览器
driver.quit()

 

注意:

千万不要用下面这种方式切换操作句柄。新增界面后,用driver.window_handles[-1],来把句柄切换到到最新新增页面。(有坑)

driver.switch_to.window(driver.window_handles[-1])
['C514C3923F2B0885AE7EA66D99EB10A3', 'AE25C5291632286CEE03566AA561956E', '5B7CA64EE69AF45F8A431F253A559524'] 列表里面的句柄不一定是按顺序的,最后一个是最新的

 

posted @ 2023-09-12 14:24  徐俊112  阅读(74)  评论(0)    收藏  举报