常用的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 webdriverfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.chrome.service import Service as ChromeServicefrom webdriver_manager.chrome import ChromeDriverManagerdef 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 timeimport pyperclipfrom selenium.webdriver import Keysfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ecfrom 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 keywait.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 Noneexcept NoSuchElementException:print(f"无法找到元素:{by}={value}")return Noneexcept 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被网站发现的问题;

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

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/102104.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatisPlus入门

入门&#xff1a; 依赖&#xff1a; <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>{version}</version> </dependency> 配置&#xff1a; ## 去除logo …

无涯教程-PHP - 标量函数声明

在PHP 7中&#xff0c;引入了一个新函数&#xff0c;即标量类型声明。标量类型声明有两个选项- Coercive - 强制性是默认模式。Strict - 严格模式必须明确提示。 可以使用上述模式强制执行以下类型的函数参数- intfloatbooleanstringinterfacesarraycallable 强制模…

opencv 进阶15-检测DoG特征并提取SIFT描述符cv2.SIFT_create()

前面我们已经了解了Harris函数来进行角点检测&#xff0c;因为角点的特性&#xff0c;这些角点在图像旋转的时候也可以被检测到。但是&#xff0c;如果我们放大或缩小图像时&#xff0c;就可能会丢失图像的某些部分&#xff0c;甚至有可能增加角点的质量。这种损失的现象需要一…

Revit 3D高效处理:cad exchanger sdk 3.21 Crack

3D 格式概述&#xff1a;Revit Revit 已成为寻求高效、准确的建筑信息建模的专业人士的首选解决方案。在这篇引人入胜的功能概述中了解 Revit 的特性和影响。 什么是Revit&#xff1f; Autodesk Revit 是一款流行的 CAD 软件&#xff0c;重点关注 BIM&#xff0c;被建筑师、工…

C++入门:引用是什么

目录 1.引用的概念 2.引用的特征 3.常引用 4.引用使用场景 5.传值&#xff0c;传引用效率比较 6.引用与指针的区别 1.引用的概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它和它引用…

AUTBUS全球首发,东土与您相约工博会

2023年中国国际工业博览会将于9月19日至9月23日在上海盛大举办。作为工博会重点参展企业之一&#xff0c;东土科技将重磅亮相6.1号馆工业自动化展&#xff08;展位号&#xff1a;6.1H-D137&#xff09;。 值得一提的是&#xff0c;AUTBUS 国际标准作为全球第一个基于时间敏感网…

LLMs 缩放法则和计算最优模型Scaling laws and compute-optimal models

在上一个视频中&#xff0c;您探讨了训练大型语言模型的计算挑战。在这里&#xff0c;您将了解关于模型大小、训练、配置和性能之间关系的研究&#xff0c;以确定模型需要多大。请记住&#xff0c;预训练期间的目标是最大化模型的学习目标性能&#xff0c;即在预测令牌时最小化…

LeetCode--HOT100题(38)

目录 题目描述&#xff1a;226. 翻转二叉树&#xff08;简单&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;226. 翻转二叉树&#xff08;简单&#xff09; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 LeetCode做题链…

pytorch 入门1-tensor 广播 view reshape

tensor 的四则运算broadcast import torch import numpy as np # 张量tensor 随机初始化 x torch.rand(4,3) print(x) y torch.randn(4,3) print(y)# 初始化全零 张量 a torch.zeros((4,4),dtypetorch.long) print(a) #初始化全一 张量 b torch.ones(4,4) print(b) c tor…

多客户企业选择拥有哪些功能的CRM系统?

管理海量客户信息对于每一家企业都是巨大的挑战。粗放式的管理客户资料是对资源的一种浪费&#xff0c;让很多有意向的高价值客户流失。客户比较多&#xff0c;有什么CRM系统推荐吗&#xff1f;帮助企业轻松地跟进客户&#xff0c;提高销售效率&#xff1f; 1.易于使用 首先是…

macOS Ventura 13.5.1(22G90)发布(附黑/白苹果系统镜像地址)

系统镜像下载&#xff1a;百度&#xff1a;黑果魏叔 系统介绍 黑果魏叔 8 月 18 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 13.5.1 更新&#xff08;内部版本号&#xff1a;22G90&#xff09;&#xff0c;本次更新距离上次发布隔了 24 天。 本次更新重点修复了…

Docker部署MongoDB 5.0.5

1、查看目录 rootwielun:~# tree mongo mongo ├── conf │ └── mongod.conf ├── data ├── docker-compose.yml └── logrootwielun:~# cd mongo rootwielun:~/mongo# chmod 777 log2、配置docker-compose.yml rootwielun:~/mongo# cat docker-compose.yml ve…

【ES6】—【必备知识】—扩展运算符与rest参数

一、扩展运算符 1. 定义&#xff1a;把数组或类数组展开成用逗号隔开的值 function foo(a,b,c) {console.log(a,b,c) } let arr [1,2,3] foo(...arr)2. 把两个数组合并 2-1. ES5 实现 let arr1 [1,2,3] let arr2 [4,5,6] Array.prototype.push.apply(arr1, arr2) consol…

多线程+隧道代理:提升爬虫速度

在进行大规模数据爬取时&#xff0c;爬虫速度往往是一个关键问题。本文将介绍一个提升爬虫速度的秘密武器&#xff1a;多线程隧道代理。通过合理地利用多线程技术和使用隧道代理&#xff0c;我们可以显著提高爬虫的效率和稳定性。本文将为你提供详细的解决方案和实际操作价值&a…

文心一言 VS 讯飞星火 VS chatgpt (80)-- 算法导论7.4 5题

五、如果用go语言&#xff0c;当输入数据已经“几乎有序”时&#xff0c;插入排序速度很快。在实际应用中&#xff0c;我们可以利用这一特点来提高快速排序的速度。当对一个长度小于 k 的子数组调用快速排序时&#xff0c;让它不做任何排序就返回。当上层的快速排序调用返回后&…

国产精品:讯飞星火最新大模型V2.0

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

ethers.js2:provider提供商

1、Provider类 Provider类是对以太坊网络连接的抽象&#xff0c;为标准以太坊节点功能提供简洁、一致的接口。在ethers中&#xff0c;Provider不接触用户私钥&#xff0c;只能读取链上信息&#xff0c;不能写入&#xff0c;这一点比web3.js要安全。 除了之前介绍的默认提供者d…

VMware 使用U盘进入PE系统,下划线光标闪烁

一、前言 vmware虚拟机各种原因崩溃&#xff0c;然后又没有快照&#xff0c;怎么办&#xff1f; 或者 密码忘记了无法开机&#xff0c;这时候就想到使用PE了。 二、分析 但是使用U盘进入PE的时候&#xff0c;遇到了各种问题&#xff1a; 加载U盘修改启动顺序启动后出现下划线…

介绍Server-Sent Events,以及使用,超级简单!

一、SSE 的本质 严格地说&#xff0c;HTTP 协议无法做到服务器主动推送信息。但是&#xff0c;有一种变通方法&#xff0c;就是服务器向客户端声明&#xff0c;接下来要发送的是流信息&#xff08;streaming&#xff09;。 也就是说&#xff0c;发送的不是一次性的数据包&…

[四次挥手]TCP四次挥手握手由入门到精通(知识精讲)

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;(*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &am…