[Web自动化] Selenium浏览器对象方法(操纵浏览器)

8.7 Selenium浏览器对象方法(操纵浏览器)

通过浏览器对象可以控制浏览器进行操作,你可以模拟用户的各种行为,如调整浏览器大小前进后退刷新页面等。此外,处理等待机制、窗口和标签页管理以及弹窗也是自动化过程中常见的需求。

8.7.1 浏览器控制

控制浏览器大小、最大化、最小化

  • 调整浏览器大小
    你可以使用set_window_size()方法来设置浏览器窗口的大小(以像素为单位)。
python 复制代码
driver.set_window_size(width, height)
  • 最大化浏览器
    使用maximize_window()方法可以将浏览器窗口最大化。
python 复制代码
driver.maximize_window()

注意:最小化浏览器窗口的功能在Selenium中不是直接支持的,因为这通常是由操作系统控制的。

浏览器的前进、后退、刷新操作

  • 前进
    使用forward()方法可以使浏览器前进到历史记录中的下一个页面(如果有的话)。
python 复制代码
driver.forward()
  • 后退
    使用back()方法可以使浏览器后退到历史记录中的上一个页面。
python 复制代码
driver.back()
  • 刷新
    使用refresh()方法可以刷新当前页面。
python 复制代码
driver.refresh()

浏览器的关闭、退出

py 复制代码
driver.close()  # 关闭当前窗口
driver.quit()  # 退出浏览器

8.7.2 等待机制

在自动化测试中,由于网络延迟或页面加载时间的不同,经常需要等待某些元素或条件成立后再执行后续操作。Selenium提供了几种等待机制来处理这种情况。
显式等待(Explicit Wait)

显式等待是针对某个特定条件进行等待,直到该条件成立或超出设定的等待时间。这通常使用WebDriverWait类和expected_conditions模块来实现。

python 复制代码
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

wait = WebDriverWait(driver, 10)# 等待最多10秒
element = wait.until(EC.presence_of_element_located((By.ID, "element_id")))

expected_conditions类提供的预期条件判断方法:

方法 ** 说明**
title_is 判断当前页面的标题是否等于预期
title_contains 判断当前页面的标题是否包含预期字符串
presence_of_element_located 判断元素是否被加在DOM树里,并不代表该元素一定可见
visibility_of_element_located 判断元素可见(元素非隐藏,且元素宽和高都不等于0)
visibility_of 与上一个方法相同,只是上一个方法参数为定位;该方法接收的参数为定位后的元素
presenece_of_all_elements_located 判断是否至少有一个元素存在于DOM树中。例如,在百度首页有n个元素的class为mnav,那么只要有一个存在,就返回true
text_to_be_present_in_element 判断某个元素的text是否包含了预期的字符串
text_to_be_present_in_element_value 判断某个元素的value属性是否包含了预期的字符串
frame_to_be_available_and_switch_to_it 判断该表单是否可以切换进去,如果可以,返回true并且switch进去,否则返回false
invisibility_of_element_located 判断某个元素是否不存在与DOM树或不可见
invisibility_to_be_clickable 判断元素是否可见且可以点击
staleness_of 等到一个元素从DOM树中移除
element_to_be_selected 判断某个元素是否被选中,一般用在下拉列表
element_selection_state_to_be 判断某个元素的选中状态是否符合预期
element_located_selection_state_to_be 与上一个方法作用相同,只是上一个方法参数为定位后的元素,该方法接收的参数为定位
alert_is_present 判断页面上是否存在alert

隐式等待(Implicit Wait)

隐式等待是全局性的,它设置了WebDriver在尝试查找元素时应该等待的最长时间。如果在这段时间内找到了元素,则立即返回该元素;如果超时仍未找到,则抛出异常。

python 复制代码
driver.implicitly_wait(10)# 设置隐式等待时间为10秒

强制等待(time.sleep)

虽然time.sleep()方法可以用作简单的等待方式,但它并不推荐在自动化测试中频繁使用,因为它会强制程序暂停执行指定的时间,而不考虑实际的页面加载情况。

python 复制代码
import time
time.sleep(5)  # 程序暂停5秒

8.7.3 窗口和标签页管理

在页面操作过程中,如果弹出新的窗口,此时需要切换到新打开的窗口进行操作。否则driver依然停留在原来的页面,针对新窗口的操作会出现错误。
打开新标签页并切换
方法一:使用键盘按键模拟(Ctrl/Command + Click)

在Selenium中,你可以使用ActionChains类来模拟键盘和鼠标的行为,包括按住Ctrl(在Windows/Linux上)或Command(在Mac上)键的同时点击链接。

py 复制代码
from selenium import webdriver  
from selenium.webdriver.common.action_chains import ActionChains  
from selenium.webdriver.common.keys import Keys  
  
# 初始化WebDriver  
driver = webdriver.Chrome()  
  
# 打开一个网页  
driver.get("https://www.example.com")  
  
# 假设页面上有一个ID为"linkId"的链接  
link = driver.find_element_by_id("linkId")  
  
# 使用ActionChains模拟按下Ctrl/Command键并点击链接  
action = ActionChains(driver)  
action.key_down(Keys.CONTROL if driver.name == "chrome" else Keys.COMMAND)  # 根据浏览器类型选择Ctrl或Command  
action.click(link)  
action.key_up(Keys.CONTROL if driver.name == "chrome" else Keys.COMMAND)  
action.perform()  
  
# 此时,新的标签页已经被打开,但Selenium仍然控制在原始标签页上  
# 如果你需要切换到新的标签页,你需要先获取所有窗口句柄,然后切换到新的窗口句柄

方法二:使用JavaScript执行

另一种方法是使用execute_script方法来运行JavaScript代码,从而打开一个新的标签页。

py 复制代码
from selenium import webdriver  
  
# 初始化WebDriver  
driver = webdriver.Chrome()  
  
# 打开一个网页  
driver.get("https://www.example.com")  
  
# 使用JavaScript打开新的标签页  
new_tab_url = "https://www.google.com"  
driver.execute_script(f"window.open('{new_tab_url}', '_blank');")  
  
# 切换到新的标签页  
# 注意:这可能需要一些等待时间以确保新的标签页已经打开  
# 下面的代码片段假设你知道如何切换到新的窗口句柄  
# 通常需要首先获取所有窗口句柄,然后找到新的那个

方法三:浏览器快捷键方式(Ctrl+T)

py 复制代码
from selenium import webdriver  
from selenium.webdriver.common.action_chains import ActionChains  
from selenium.webdriver.common.keys import Keys  
  
# 初始化WebDriver  
driver = webdriver.Chrome()  
  
# 打开一个网页(可选,但通常你会想要从一个具体的页面开始)  
driver.get("https://www.example.com")  
  
# 使用Actions类模拟按下Ctrl+T快捷键  
action = ActionChains(driver)  
action.key_down(Keys.CONTROL).send_keys('t').key_up(Keys.CONTROL).perform()  
  
# 此时,一个新的标签页已经被打开,但WebDriver仍然控制在原始标签页上  
# 如果你需要切换到新的标签页,你需要先获取所有窗口句柄,然后切换到新的窗口句柄  
  
# 切换到新的标签页(可选,但如果你需要在新标签页中执行操作,则必须这样做)  
# 获取所有窗口句柄  
handles = driver.window_handles  
# 切换到最新的标签页(通常是最后一个句柄)  
driver.switch_to.window(handles[-1])  
  
# 现在你可以在新标签页中执行任何需要的操作了

切换窗口和标签页

在Web应用中,用户可能会打开多个窗口或标签页。Selenium允许你通过窗口句柄(window handle)来切换当前操作的窗口或标签页。

python 复制代码
# 获取当前窗口句柄
current_window = driver.current_window_handle

# 获取所有窗口句柄
all_windows = driver.window_handles

# 切换到其他窗口
for window in all_windows:
if window != current_window:
driver.switch_to.window(window)
# 在这里执行其他窗口的操作
...
# 切换回原始窗口
driver.switch_to.window(current_window)

切换到新标签

py 复制代码
currentwin = driver.current_window_handle  # 在没有点击之前,保存当前窗口句柄
# 点击之后(浏览器产生了新标签):
for i in driver.window_handles:
    if currentwin == i:
        continue
    else:
        driver.switch_to.window(i)      #移动句柄到新窗口中

切换到其它标签

因为所有窗口句柄是一个列,所以可以用下面的方法。

py 复制代码
driver.switch_to.window(driver.window_handles[1])  # 切换到窗口句柄中的第2个
driver.switch_to.window(driver.window_handles[-1]  # 切换到窗口句柄中的倒数第一个

处理弹窗(警告框、确认框、输入框等)

Selenium提供了Alert类来处理JavaScript生成的弹窗(如警告框alert、确认框confirm、输入框等prompt)。

1、alert:

2、confirm:

3、prompt:

python 复制代码
# 获取弹窗
alert = driver.switch_to.alert

# 处理不同类型的弹窗
# 读取警告框(alert)的文本
text = alert.text

# 在输入框(prompt)中输入文本
# alert.send_keys("some text")

# 接受确认框confirm
alert.accept()

# 拒绝确认框confirm(如果适用)
# alert.dismiss()
相关推荐
寻星探路1 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
崔庆才丨静觅2 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60613 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了3 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅3 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
ValhallaCoder3 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
崔庆才丨静觅4 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
猫头虎4 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
崔庆才丨静觅4 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment4 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端