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 来执行操作,由浏览器厂商提供。

  • Browser:浏览器接收到来自驱动的指令后,执行对应的操作。

Python安装Selenium依赖:

pip install selenium

Web Driver

在进行模拟操作浏览器之前需要先创建WebDriver对象,通过该对象来驱动对应的浏览器。

注意:Browser Driver和浏览器的版本需要一致;如果没有显式指定service​,Selenium会从环境变量、默认路径或通过WebDriverManager​来启动Driver,WebDriverManager​它会帮助你自动下载并管理ChromeDriver​,并在运行时自动启动对应的驱动。

Web Driver对象的创建:

from selenium import webdriver

# 使用谷歌浏览器的驱动
service = webdriver.chrome.service.Service('chromedriver.exe')
# 创建 ChromeDriver 对象
driver = webdriver.Chrome(service=service)

# 通过 WebDriverManager 创建 FirefoxDriver 对象
driver = webdriver.Firefox()

# 创建 Safari 浏览器,MacOS 自带 SafariDriver
driver = webdriver.Safari()

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

# 通过ID定位元素
element = driver.find_element(by=By.ID, value="ele_id")

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

# 定位下拉框
select_ele = driver.find_element(By.XPATH, '')
# 创建Select对象
select_ele = Select(select_ele)
# 以可见文本内容选择
select_ele.select_by_visible_text('')

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

from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec

# 显式等待1秒
WebDriverWait(driver, 5).until(
ec.presence_of_element_located(
(By.XPATH, '')
)).click()

# 隐式等待1秒,全局生效
driver.implicitly_wait(5)

# 强制等待
time.sleep(5)

显式等待:等待指定的元素,在达到某个特定的条件或超时后,才继续执行。

隐式等待:等待所有页面加载完成或超时后,才继续执行。

强制等待:无条件让程序暂停指定时间,等时间到了,才继续执行。

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

# 创建ac对象
action = ActionChains(driver)
# 移动到输入框元素输入文本
action.move_to_element(ele).send_keys('')
# 移动到按钮元素点击按钮
action.move_to_element(ele).click()
# 执行所有操作
action.perform()