Selenium 4 窗口处理
在Selenium自动化测试中,窗口处理是一个重要的技术。随着Selenium 4的发布,窗口处理功能得到了大幅改进和增强。本文将介绍如何使用Selenium 4来处理窗口操作。
获取当前窗口句柄
要获取当前窗口的句柄(handle),可以使用
driver.current_window_handle
方法。示例代码如下:
current_handle = driver.current_window_handle
示例
from selenium import webdriver
# 创建 ChromeDriver 实例
driver = webdriver.Chrome()# 打开 CSDN 网站
driver.get("https://www.csdn.net/")# 获取当前窗口句柄
current_handle = driver.current_window_handle
# 输出当前窗口句柄print("当前窗口句柄:", current_handle)# 在这里可以执行其他操作,例如点击链接、填写表单等# 关闭浏览器窗口
driver.close()# 退出 ChromeDriver
driver.quit()
输出结果
当前窗口句柄: 12AA3B8EAE3E20CAF9A97C1662A9AC9F
**
注解
**
浏览器当前窗口句柄(handle)是一个由数字和字母组成的字符串,用于在操作系统中唯一标识一个窗口实例。这种标识方式的原因在于计算机底层的内存管理和操作系统设计。
- 内存地址唯一标识性: 计算机操作系统为每个进程和应用程序分配一块内存地址空间,用于存储其数据和执行代码。窗口作为应用程序的一部分,也会被分配一块内存空间。这些内存地址在计算机内部以二进制数字表示,但在可读性和易用性方面不如十六进制(包括字母和数字的组合)表示。
- 十六进制的可读性: 将内存地址表示为十六进制字符串(由数字和字母组成)更容易被人类理解和处理。相比起纯数字的内存地址,十六进制更加紧凑且易于区分,而且可以在日志和调试信息中方便地使用。
- 操作系统跨平台性: 使用数字和字母的组合作为窗口句柄可以保证在不同操作系统和硬件体系结构下都能够使用相同的标识方式。这种跨平台性对于开发者和自动化测试工具(例如 Selenium)来说是非常有价值的,因为它们可以在不同环境中保持一致的代码。
总之,浏览器当前窗口句柄的数字和字母组合是一种为了在计算机系统中唯一标识窗口实例而采用的标识方式,兼顾了内部表示的需要和人类可读性的要求。
获取所有窗口句柄
要获取所有打开的窗口的句柄,可以使用
driver.window_handles
方法。示例代码如下:
all_handles = driver.window_handles
示例
from selenium import webdriver
# 创建 ChromeDriver 实例
driver = webdriver.Chrome()# 打开第一个窗口并访问 CSDN 网站
driver.get("https://www.csdn.net/")# 在第一个窗口打开新的标签页
driver.execute_script("window.open('', '_blank');")# 获取所有窗口句柄
all_handles = driver.window_handles
# 遍历所有窗口句柄并输出for handle in all_handles:print("窗口句柄:", handle)# 在第二个标签页中打开 CSDN 博客首页
driver.switch_to.window(all_handles[1])
driver.get("https://blog.csdn.net/")# 在这里可以执行其他操作,例如在不同标签页中进行切换、填写表单等# 关闭浏览器窗口
driver.close()# 退出 ChromeDriver
driver.quit()
切换到指定窗口
要切换到指定的窗口,可以使用
driver.switch_to.window(handle)
方法,其中
handle
是要切换到的窗口句柄。示例代码如下:
target_handle = all_handles[1]# 假设要切换到第二个窗口
driver.switch_to.window(target_handle)
示例
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
import time
# 创建 ChromeDriver 实例
driver = webdriver.Chrome()# 打开第一个网站
driver.get("https://www.baidu.com/")# 等待第一个网站加载完成
wait = WebDriverWait(driver,20)
wait.until(EC.title_contains("百度"))# 在第一个窗口打开新的标签页(第二个网站)
driver.execute_script("window.open('https://juejin.cn/', '_blank');")# 在第一个窗口打开新的标签页(第三个网站)
driver.execute_script("window.open('https://www.csdn.net/', '_blank');")# 停顿10秒
time.sleep(10)# 获取所有窗口句柄
all_handles = driver.window_handles
# 切换到第三个窗口
driver.switch_to.window(all_handles[2])
wait.until(EC.title_contains("CSDN"))# 等待第三个网站加载完成# 切换回第二个窗口
driver.switch_to.window(all_handles[1])
wait.until(EC.title_contains("掘金"))# 等待第二个网站加载完成# 打印第二个窗口的句柄和网页标题
second_window_handle = all_handles[1]
second_window_title = driver.title
print("第二个窗口的句柄:", second_window_handle)print("第二个窗口的网页标题:", second_window_title)# 关闭浏览器窗口
driver.quit()
代码逻辑流程
- 导入所需的 Selenium 模块和类。
- 创建 ChromeDriver 实例。
- 打开第一个网站(百度)并等待加载完成。
- 在第一个窗口打开新的标签页(第二个网站 - 掘金)。
- 在第一个窗口打开新的标签页(第三个网站 - CSDN)。
- 停顿10秒,确保新打开的标签页有足够的时间加载内容。
解释一下为什么这里要强制等待10秒:因为已经打开了三个网站,但是在测试时可能会受到网速影响,网页加载不完全,因为状态还是在等待加载中,没有完全加载完毕还是会继续执行后面的代码,从而报错发生异常所以还是要加上强制等待,利于观察到第三个完整加载完毕然后切换到第二个窗口的整个过程
- 获取所有窗口句柄。
- 切换到第三个窗口(CSDN网站)并等待加载完成。
- 切换回第二个窗口(掘金网站)并等待加载完成。
- 打印第二个窗口的句柄和网页标题。
- 关闭浏览器窗口。
总的来说,这段代码的目标是在一个浏览器窗口中打开百度、掘金和CSDN三个网站,切换窗口并等待页面加载完成,然后打印出第二个窗口的句柄和网页标题。代码中使用了 WebDriver 的等待机制(WebDriverWait)来确保页面在必要时得以完全加载。最后,浏览器窗口会被关闭。
关闭当前窗口
要关闭当前窗口,可以使用
driver.close()
方法。示例代码如下:
driver.close()
示例
from selenium import webdriver
# 初始化浏览器驱动
driver = webdriver.Chrome()import time
# 打开百度网站
driver.get("https://www.baidu.com/")# 在新窗口中打开 CSDN 网站
driver.execute_script("window.open('https://www.csdn.net/', '_blank')")# 获取所有窗口句柄
window_handles = driver.window_handles
# 切换到新窗口(CSDN 窗口)
driver.switch_to.window(window_handles[1])
time.sleep(5)# 关闭 CSDN 窗口
driver.close()# 切换回原始窗口(百度窗口)
driver.switch_to.window(window_handles[0])# 获取并打印当前网页标题print("当前网页标题:", driver.title)
time.sleep(5)# 关闭浏览器
driver.quit()
在新窗口中打开链接
要在新窗口中打开链接,可以使用
driver.execute_script
方法配合JavaScript代码来实现。示例代码如下:
# 点击一个链接,新窗口会打开
link_element = driver.find_element(By.XPATH,"//a[contains(text(),'Open Link')]")
driver.execute_script("window.open(arguments[0], '_blank')", link_element.get_attribute("href"))# 切换到新窗口
new_handle = driver.window_handles[-1]
driver.switch_to.window(new_handle)
示例
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
# 初始化浏览器驱动
driver = webdriver.Chrome()# 打开百度网站
driver.get("https://www.baidu.com")# 点击链接,新窗口会打开
link_element = driver.find_element(By.LINK_TEXT,'新闻')
driver.execute_script("window.open(arguments[0], '_blank')", link_element.get_attribute("href"))# 切换到新窗口
new_handle = driver.window_handles[-1]
driver.switch_to.window(new_handle)
sleep(5)# 在新窗口进行操作# ...# 关闭新窗口
driver.close()# 切换回原始窗口
original_handle = driver.window_handles[0]
driver.switch_to.window(original_handle)# 获取并打印当前网页标题print("当前网页标题:", driver.title)
sleep(5)# 关闭浏览器
driver.quit()
这些是Selenium 4中处理窗口的常用方法。通过这些方法,可以轻松地控制和操作窗口,以实现自动化测试中的各种场景。
版权归原作者 鹅不糊涂 所有, 如有侵权,请联系我们删除。