Selenium
Selenium
Selenium 是一个强大的自动化测试工具,广泛应用于浏览器自动化。
核心执行原理:采用 C/S 架构,将编写的客户端脚本通过HTTP请求,调用 WebDriver 服务端的 API,然后 WebDriver 服务端将这些指令发送给浏览器驱动(Browser Driver),浏览器驱动再调用浏览器的原生 API 来执行操作,从而达到代码脚本来控制浏览器的行为。
简单来说,Selenium 本质上是通过 WebDriver 与浏览器驱动交互,驱动浏览器按照预设的步骤执行 UI 操作。
核心组成:
-
Selenium Client:编写的 Selenium 测试脚本,会调用 WebDriver API,例如打开网页、点击按钮、输入文本等。
-
WebDriver Server:是一个 HTTP 服务,它接收来自测试脚本的 HTTP 请求,然后将这些指令传递给 浏览器驱动。
-
Browser Driver:每个浏览器都有一个对应的 驱动程序,浏览器驱动会根据 WebDriver 指令,调用浏览器的 原生 API 来执行操作,由浏览器厂商提供。
- Chrome 浏览器 →
chromedriver
- Firefox 浏览器 →
geckodriver
- Edge 浏览器 →
msedgedriver
- Chrome 浏览器 →
-
Browser:浏览器接收到来自驱动的指令后,执行对应的操作。
Python安装Selenium依赖:
pip install selenium |
Web Driver¶
在进行模拟操作浏览器之前需要先创建WebDriver对象,通过该对象来驱动对应的浏览器。
注意:Browser Driver和浏览器的版本需要一致;如果没有显式指定service
,Selenium会从环境变量、默认路径或通过WebDriverManager
来启动Driver,WebDriverManager
它会帮助你自动下载并管理ChromeDriver
,并在运行时自动启动对应的驱动。
Web Driver对象的创建:
from selenium import webdriver |
Driver 常用属性:
-
driver.title
:获取当前页面的标题。 -
driver.current_url
:获取当前页面的 URL。 -
driver.page_source
:获取当前页面的完整 HTML 源代码。 -
driver.current_window_handle
:获取当前浏览器窗口的句柄。 -
driver.window_handles
:获取所有打开的浏览器窗口句柄。
Driver 常用方法:
-
driver.get(url)
:打开一个网页。 -
driver.maximize_window()
:最大化浏览器窗口。 -
driver.minimize_window()
:最小化浏览器窗口。 -
driver.set_window_size(width, height)
:设置浏览器窗口的大小。 -
driver.set_window_position(x, y)
:设置浏览器窗口的位置。 -
driver.implicitly_wait(time)
:设置隐式等待时间。 -
driver.forward()
:浏览器前进。 -
driver.back()
:浏览器后退。 -
driver.refresh()
:刷新页面。 -
driver.quit()
:关闭浏览器并结束 WebDriver 会话。 -
driver.close()
:关闭当前浏览器窗口。 -
driver.switch_to.window(window_name)
:切换到指定窗口。
driver.switch_to.alert
:切换到指定弹窗。
driver.switch_to.frame(iframe_element)
:切换到指定内敛框架。
driver.switch_to.parent_frame()
:切换到其父级框架。 -
driver.switch_to.default_content()
:切换回到主文档。 -
driver.get_current_url()
:获取当前页面的 URL。 -
driver.get_title()
:获取当前页面的标题。 -
driver.save_screenshot(filename)
:截图并保存为png图片。
By¶
在模拟操作之前需要先捕获页面的元素,driver拥有八大定位方式。
-
By.ID
:按 ID 定位元素。 -
By.NAME
:按 NAME 定位元素。 -
By.CLASS_NAME
:按类名定位元素。 -
By.TAG_NAME
:按标签名定位元素。 -
By.XPATH
:按 XPath 定位元素。 -
By.CSS_SELECTOR
:按 CSS 选择器定位元素。 -
By.LINK_TEXT
:按完整的链接文本来定位超链接元素。 -
By.PARTIAL_LINK_TEXT
:按部分链接文本来定位超链接元素。
示例:
from selenium.webdriver.common.by import By |
WebElement¶
网页元素的对象,通过它可以与页面上的元素进行交互。
常用属性:
-
element.text
:获取元素的文本内容。 -
element.size
:获取元素大小。 -
element.id
:获取元素的ID。 -
element.tag_name
:获取元素的标签名。 -
element.location
:获取元素的位置x,y。 -
element.parent
:获取元素的父元素。 -
element.rect
:获取元素的位置和大小。
常用方法:
-
element.click()
:点击元素。 -
element.send_keys(keys)
:向输入框发送按键。 -
element.clear()
:清除输入框内容。 -
element.get_attribute("attribute_name")
:获取元素的属性值。 -
element.text
:获取元素的文本内容。 -
element.is_displayed()
:检查元素是否可见。 -
element.is_enabled()
:检查元素是否可用(是否处于激活状态)。 -
element.is_selected()
:检查元素是否被选中(适用于复选框等)。 -
element.submit()
:提交表单。
Select¶
selenium.webdriver.support.ui.Select
用于操作下拉框。
-
select_by_visible_text("option_text")
:通过文本选择。 -
select_by_index(option_index)
:通过索引选择。 -
select_by_value("option_value")
:通过项值选择。
示例:
from selenium.webdriver.support.ui import Select |
Alert¶
selenium.webdriver.common.alert.Alert
用于操作弹窗。
-
text
:获取弹窗文本。 -
send_keys()
:向弹窗发送按键。 -
accept()
:接受确认弹窗。 -
dismiss()
:拒绝取消弹窗。
Keys¶
selenium.webdriver.common.keys.Keys
用于模拟键盘。
-
Keys.ENTER
:模拟 Enter 键。 -
Keys.TAB
:模拟 Tab 键。 -
Keys.BACKSPACE
:模拟 Backspace 键。 -
Keys.ESCAPE
:模拟 Escape 键。 -
Keys.SPACE
:模拟 空格键。 -
Keys.UP
:模拟 向上箭头键。 -
Keys.DOWN
:模拟 向下箭头键。 -
Keys.LEFT
:模拟 向左箭头键。 -
Keys.RIGHT
:模拟 向右箭头键。 -
Keys.SHIFT
:模拟 Shift 键。 -
Keys.CONTROL
:模拟 Ctrl 键。 -
Keys.ALT
:模拟 Alt 键。 -
Keys.CAPS_LOCK
:模拟 Caps Lock 键。 -
Keys.F1
-Keys.F12
:模拟 F1 到 F12 键。
WebDriverWait¶
selenium.webdriver.support.ui.WebDriverWait
用于显式等待元素加载。
-
until()
:用于等待某个条件为 True。 -
until_not()
:用于等待某个条件 False。
Expected Conditions¶
selenium.webdriver.support.expected_conditions
用于配合 WebDriverWait
来实现显式等待。
-
presence_of_element_located(locator)
:等待元素在 DOM 中存在(无论是否可见)。 -
visibility_of_element_located(locator)
:等待元素在页面上可见(元素必须在 DOM 中存在且可见)。 -
visibility_of(element)
:等待某个已定位的元素在页面上可见(元素已经被找到并且可见)。 -
element_to_be_clickable(locator)
:等待元素可点击(元素必须可见且可交互,即不被禁用)。 -
element_to_be_clickable(element)
:等待某个已定位的元素可点击。 -
staleness_of(element)
:等待元素从页面中被移除或变得过时(例如页面重新加载时)。 -
invisibility_of_element_located(locator)
:等待元素不可见(即元素被删除或隐藏)。 -
invisibility_of_element(element)
:等待已定位的元素不可见。 -
text_to_be_present_in_element(locator, text)
:等待指定元素的文本内容与给定的文本匹配。 -
text_to_be_present_in_element_value(locator, text)
:等待指定元素的value
属性值包含给定的文本(常用于表单输入框)。 -
frame_to_be_available_and_switch_to_it(locator)
:等待iframe
元素加载并切换到该iframe
。 -
alert_is_present()
:等待页面上出现alert
弹框。
示例:
import time |
显式等待:等待指定的元素,在达到某个特定的条件或超时后,才继续执行。
隐式等待:等待所有页面加载完成或超时后,才继续执行。
强制等待:无条件让程序暂停指定时间,等时间到了,才继续执行。
ActionChains¶
selenium.webdriver.ActionChains
用于模拟鼠标和键盘操作的类,可以进行复杂的用户行为模拟。
点击事件:
click(on_element=None)
:在指定元素上单击。如果没有指定元素,则在当前鼠标位置单击。-
click_and_hold(on_element=None)
:在指定的元素上点击并保持按下状态。释放需要使用release()
方法。 -
release(on_element=None)
:释放鼠标按键,通常在调用click_and_hold()
后使用。 -
context_click(on_element=None)
:右键点击指定的元素。如果没有指定元素,则在当前鼠标位置右键点击。 -
double_click(on_element=None)
:双击指定的元素。如果没有指定元素,则在当前鼠标位置双击。
移动事件:
-
move_to_element(to_element)
:将鼠标移动到指定元素上。 -
move_to_element_with_offset(to_element, xoffset, yoffset)
:将鼠标移动到指定元素的相对坐标。 -
drag_and_drop(source, target)
:将元素从source
位置拖动到target
位置。 -
drag_and_drop_by_offset(source, xoffset, yoffset)
:将元素从source
位置拖动到指定的偏移位置。
键盘事件:
-
send_keys(*keys_to_send)
:向当前元素发送键盘输入。 -
send_keys_to_element(element, *keys_to_send)
:向指定的元素发送键盘输入。 -
key_down(value, element=None)
:按下指定的键盘键。如果element
被提供,则在该元素上按下。 -
key_up(value, element=None)
:释放指定的键盘键。如果element
被提供,则在该元素上释放。
滚动条事件:
-
scroll_by_amount(x, y)
:以指定的数量(x轴和y轴)滚动页面。 -
scroll_to_element(element)
:滚动页面直到指定的元素可见。
其他事件:
-
pause(seconds)
:在操作之间插入一个指定秒数的暂停,常用于调试或模拟用户的思考时间。 -
perform()
:执行所有队列中的操作。可以通过在所有操作之后调用此方法来执行动作链。 -
release()
:释放所有按住的鼠标按钮。
示例:
from selenium.webdriver import ActionChains |