news 2026/4/21 3:10:36

常用的Selenium基础使用模板和简单封装

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
常用的Selenium基础使用模板和简单封装

前言

近来又用上了 Selneium ,因为反复用到,所以在这里将一些常用的方法封装起来,方便后续的使用。

在这篇文章中,我们将探讨Selenium的基础模板和基础封装,以便更好地理解Selenium的使用方法。

在Selenium的使用过程中,创建浏览器和 定位节点等是最常见的操作,

这里将常用的方法记录下来,以其减少后续在使用过程中的烦恼。

实现

基础使用模板

Selenium4创建浏览器需要传入Service。

在使用 Selenium 时候,有时候需要隐藏一些Selenium的特征。

代码

代码释义

·使用了 ChromeDriverManager 来处理 chromedriver.exe 驱动的问题

·考虑到驱动 和 js文件的问题,webdriver_path 和 js_file_path 都是可选参数,不传也不会报错

# -*- coding: utf-8 -*- # Name: model_main.py # Author: 小菜 # Date: 2023/5/20 10:45 # Description: from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.chrome.service import Service as ChromeService from webdriver_manager.chrome import ChromeDriverManager def init_driver(webdriver_path=None, js_file_path=None) -> webdriver.Chrome: """ 初始化浏览器驱动. Args: webdriver_path(str):浏览器驱动路径 js_file_path(str):js文件路径,用于隐藏Selenium的特征 Returns: driver: 浏览器驱动对象 """ driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager(path=webdriver_path).install())) if js_file_path: js = open(file=js_file_path, encoding='utf-8') driver.execute_cdp_cmd( cmd_args={'source': js}, cmd="Page.addScriptToEvaluateOnNewDocument", ) return driver

使用

然后再使用一个或多个显示等待,优雅极了!

driver = init_driver() wait_5 = WebDriverWait(driver, 5) wait_10 = WebDriverWait(driver, 10)

简单封装

这份封装,称得上是优雅。使用了显示等待,兼容Selenium支持的各种定位方式!!!

可定位一个&多个节点、点击节点、文本输入、判断元素是否存在等~

代码

代码释义

·wait 和 value 为必选参数,其余的都是可选参数;

·by 默认的定位方式是 XPATH,可以传入其它定位方式,如 id, name 等;

·method 为 click 和 input,再加上默认的 定位,已经可以覆盖99%的节点操作;

·key 为 input 时候的文本内容,使用pyperclip 将 key复制到剪切板,然后执行键盘事件进行 Ctrl + V 黏贴,效率更高;

·其余的看下面的 代码 和 使用 。

import time import pyperclip from selenium.webdriver import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as ec from selenium.common.exceptions import ( TimeoutException, NoSuchElementException, InvalidSelectorException, ) def locate_and_operate_element(wait: WebDriverWait, by='xpath', value=None, method=None, key=None, is_more=False, check_visibility=False): """ 定位元素并执行操作。 Args: wait (WebDriverWait): WebDriverWait 对象,用于显示等待元素出现 by: 元素定位方式(例如 By.ID,By.XPATH)。 value: 元素定位值(例如元素的 ID,XPath 表达式)。 method (str): 操作方法(默认为 None)。 key: 输入文本的值(默认为 None)。 is_more (bool): 是否返回多个元素,默认为 False。 check_visibility (bool): 是否检查元素可见性(默认为 False)。 Returns: WebElement: 元素对象(当 method 参数为 None 且 is_more 参数为 False 时); None: 表示元素未在指定时间内出现或无法定位到指定的元素; List[WebElement]: 多个元素对象列表(当 method 参数为 None 且 is_more 参数为 True 时)。 Raises: TimeoutException: 超时异常,表示元素未在指定时间内出现。 NoSuchElementException: 未找到元素异常,表示无法定位到指定的元素。 InvalidSelectorException: 选择器无效异常,表示使用了无效的选择器。 """ assert isinstance(wait, WebDriverWait), "wait 参数必须是 WebDriverWait 类型。" assert value, f"{value} 不能为空." try: element = wait.until(ec.presence_of_element_located((by, value))) # 根据指定的操作方法执行相应操作 # 如果不指定方法, 默认为寻找对象是否存在 if not method: if is_more: return wait.until(ec.presence_of_all_elements_located((by, value))) if check_visibility: return wait.until(ec.visibility_of_element_located((by, value))) return wait.until(ec.presence_of_element_located((by, value))) if method == 'click': wait.until(ec.element_to_be_clickable((by, value))).click() time.sleep(2) elif method == 'input': assert key wait.until(ec.visibility_of_element_located((by, value))) pyperclip.copy(key) time.sleep(0.2) element.send_keys(Keys.CONTROL, 'A') time.sleep(0.2) element.send_keys(Keys.DELETE) time.sleep(0.2) element.send_keys(Keys.CONTROL, 'V') time.sleep(0.2) except TimeoutException: print(f"超时:{by}={value}") return None except NoSuchElementException: print(f"无法找到元素:{by}={value}") return None except InvalidSelectorException: print(f"选择器无效:{by}={value}") return None

使用

结合上面的 基础使用模板:

driver = init_driver() wait_5 = WebDriverWait(driver, 5) """默认定位方式为xpath""" # 定位某个节点 locate_and_operate_element(wait_5, value='specify_node') # 定位多个节点 locate_and_operate_element(wait_5, value='specify_nodes', is_more=True) # 判断某个节点是否可见 locate_and_operate_element(wait_5, value='specify_node', check_visibility=True) # 点击指定节点 locate_and_operate_element(wait_5, value='specify_node', method='click') # 输入内容 locate_and_operate_element(wait_5, value='specify_node', method='input')

总结

本文介绍了在 Selenium使用中的基础使用模板和简单封装。

·基础使用模板,针对隐藏chromedriver.exe驱动和隐藏Selenium特征做了通用适配,从此再也不用担心驱动出错和Selenium被网站发现的问题;

·简单封装,针对定位节点、点击节点、输入文本等操作做了封装,并且针对代码给出了详细的注释。

最后作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些软件测试的学习资料,这些资料希望能给你前进的路上带来帮助。

视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 16:45:40

CTF核心知识全景解析:从基础概念到实战技巧,这一篇帮你全掌握

一、什么是CTF? CTF,即 Capture The Flag,中文名为夺旗赛,是一种网络安全技术人员之间进行技术竞技的比赛形式。 在 CTF 比赛中,参赛者需要通过解决各种与网络安全相关的技术挑战来获取“旗帜”,这些挑战…

作者头像 李华
网站建设 2026/4/20 15:58:14

CTF零基础一站式入门:附保姆级学习笔记、实战靶场与工具资源包

CTF简介: CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相发起真实攻击进行技术比拼…

作者头像 李华
网站建设 2026/4/19 23:02:30

JavaDoc Markdown 语法兼容全解析(资深架构师亲授20年经验精华)

第一章:JavaDoc Markdown 语法兼容概述JavaDoc 自 Java 8 起引入了对 HTML 标签的广泛支持,而在实际开发中,开发者常希望使用更简洁的 Markdown 风格来编写文档注释。尽管标准 JavaDoc 并不原生支持 Markdown 语法,但通过工具链扩…

作者头像 李华
网站建设 2026/4/20 16:40:43

内网渗透:三种转发方式与实战工具全解析

内网渗透必备:三种转发方式与实战工具全解析 一、前言 在内网渗透测试过程中,我们常常会遇到目标服务端口被防火墙拦截、内网主机无法直接访问公网、需要通过跳板机横向移动等场景。此时,内网转发技术就成为了突破网络限制、实现后续攻击的关…

作者头像 李华
网站建设 2026/4/16 16:12:40

如何用JPMS构建可维护系统:类文件操作标准化全解析

第一章:Shell脚本的基本语法和命令Shell脚本是Linux/Unix系统中自动化任务的核心工具,它允许用户通过一系列命令的组合实现复杂操作。编写Shell脚本时,通常以“shebang”开头,用于指定解释器。脚本的起始声明 每个Shell脚本应以如…

作者头像 李华
网站建设 2026/4/20 6:47:10

diskinfo监控ZNS SSD分区寿命延长GPU训练周期

diskinfo监控ZNS SSD分区寿命延长GPU训练周期 在现代AI训练集群中,一个常被忽视的性能瓶颈正悄然浮现:不是算力不足,也不是网络延迟,而是存储子系统的稳定性与可持续性。当千亿参数模型连续运行数周甚至数月时,传统SSD…

作者头像 李华