[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()
相关推荐
猿小羽2 小时前
[TEST] Selenium 自动化测试 - 1769003387277
selenium·测试工具
猿小羽2 小时前
[TEST] Selenium 自动化测试 - 1769003091046
selenium·测试工具
Marshmallowc2 小时前
React页面刷新数据丢失怎么办?彻底掌握LocalStorage持久化与状态回填的最佳实践
前端·javascript·react.js
郝学胜-神的一滴2 小时前
Vue国际化(i18n)完全指南:原理、实践与最佳方案
前端·javascript·vue.js·程序人生·前端框架
叫我:松哥2 小时前
基于Flask的心理健康咨询管理与智能分析,集成AI智能对话咨询、心理测评(PHQ-9抑郁量表/GAD-7焦虑量表)、情绪追踪记录、危机预警识别
大数据·人工智能·python·机器学习·信息可视化·数据分析·flask
tkevinjd2 小时前
2-初识JS
开发语言·前端·javascript·ecmascript·dom
徐先生 @_@|||2 小时前
JetBrains 公司的产品策略和技术架构(IDEA(Java)和Pycharm(Python)的编辑器)
java·python·架构
AAD555888992 小时前
光伏组件检测与识别基于RPN_X101-FPN模型实现含Python源码_1
开发语言·python
梦6502 小时前
React 类组件与函数式组件
前端·javascript·react.js