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()