您的位置:

Selenium切换窗口

一、为什么需要切换窗口

在进行Web应用程序自动化测试时,经常需要切换窗口进行操作或获取元素。一个常见的场景是根据特定的条件在新窗口中打开一个链接,然后在这个新窗口中执行测试操作。切换窗口也可用于处理弹出窗口、操作打开多个标签页的Web应用,以及测试多个窗口同时运行的应用程序。

总结来说,窗口切换对于Web应用自动化测试非常重要。此时,selenium可以帮助我们快速切换窗口进行测试操作。

二、如何切换窗口

1. 使用窗口句柄切换

在selenium中使用窗口句柄(window handle)来唯一标识每个窗口。每个窗口都有一个唯一的句柄。可以使用以下代码获取当前浏览器所有窗口的句柄:

driver.window_handles

这将返回一个窗口句柄列表,其中每个句柄代表一个窗口。

可以使用以下代码来切换到特定的窗口:

window_handle = driver.window_handles[index]
driver.switch_to.window(window_handle)

其中,index是在窗口句柄列表中的索引。

但是,这种方法存在一个问题:如果窗口顺序发生了改变,index将无法访问到正确的窗口。为了避免这个问题,我们可以使用窗口标题来切换。

2. 使用窗口标题切换

可以使用以下代码获取当前窗口的标题:

driver.title

可以使用以下代码来切换到特定的窗口:

window_title = "target_window_title"
for handle in driver.window_handles:
    driver.switch_to.window(handle)
    if driver.title == window_title:
        break

在这个例子中,我们通过循环遍历每个窗口并使用switch_to.window()方法访问每个窗口的内容。当发现具有所需标题的窗口时,我们停止切换并退出循环。

三、窗口切换的注意事项

1. 等待窗口加载

在切换到新的窗口时,需要等待页面完全加载。否则,访问窗口中的元素会引发StaleElementReferenceException异常,表示尝试访问不存在的元素。

可以使用以下代码来等待窗口加载:

window_handle = driver.window_handles[index]
wait.until(EC.new_window_is_loaded(window_handle))

其中,wait是一个WebDriverWait对象,使用expected_conditions模块的new_window_is_loaded()方法等待窗口加载。

2. 切换回父窗口

如果在测试期间打开了多个窗口,可能需要在测试结束时将控制返回到原始(或父)窗口。

可以使用以下代码来切换回原始窗口:

driver.switch_to.default_content()

这将将焦点返回到原始窗口。

3. 关闭窗口

可以使用以下代码来关闭当前或指定的窗口:

driver.close()

这将关闭当前窗口。也可以使用以下代码关闭指定的窗口:

window_handle = driver.window_handles[index]
driver.switch_to.window(window_handle)
driver.close()

在这个例子中,我们通过先切换到要关闭的窗口,然后关闭该窗口。此外,需要注意的一点是,不允许关闭最后一个窗口。

四、应用实例示例

以下代码说明如何在selenium中切换窗口并获取特定元素:

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 driver
driver = webdriver.Chrome()

# 打开网站
driver.get("https://www.google.com")

# 等待加载
wait = WebDriverWait(driver, 10)
search_box = wait.until(EC.presence_of_element_located((By.NAME, "q")))

# 搜索项
search_box.send_keys("selenium window switch")
search_box.submit()

# 新窗口打开
link_text = "Selenium Python Tutorial: Switch Tabs & Windows | Browser ..."
wait.until(EC.element_to_be_clickable(
    (By.PARTIAL_LINK_TEXT, link_text))).click()

# 切换到新窗口
wait.until(EC.new_window_is_opened)
window_handle = driver.window_handles[1]
driver.switch_to.window(window_handle)

# 在新窗口中查找元素
wait.until(EC.presence_of_element_located(
    (By.PARTIAL_LINK_TEXT, "Selenium Python Tutorial: Switch Tabs & Windows")))

# 切换回原始窗口
driver.switch_to.default_content()

# 关闭所有窗口
driver.quit()

五、总结

本文介绍了selenium中切换窗口的方法,包括使用窗口句柄和使用窗口标题切换窗口。对于窗口切换,需要注意等待窗口加载、切换回原始窗口以及关闭窗口等注意事项。