一、为什么需要切换窗口
在进行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中切换窗口的方法,包括使用窗口句柄和使用窗口标题切换窗口。对于窗口切换,需要注意等待窗口加载、切换回原始窗口以及关闭窗口等注意事项。