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

news2024/12/27 8:05:03

在这里插入图片描述

前言

近来又用上了 Selneium ,因为反复用到,所以在这里将一些常用的方法封装起来,方便后续的使用。
在这篇文章中,我们将探讨 Selenium 的基础模板和基础封装,以便更好地理解 Selenium 的使用方法。

Selenium的使用过程中,创建浏览器定位节点等是最常见的操作,
这里将常用的方法记录下来,以其减少后续在使用过程中的烦恼。

知识点📖📖

作用链接
WebDriver文档https://www.selenium.dev/zh-cn/documentation/webdriver

实现

基础使用模板

Selenium4创建浏览器需要传入Service

在使用 Selenium 时候,有时候需要隐藏一些Selenium的特征。
参考这篇文章:【Selenium】Selenium绕过检测 & 隐藏特征

代码

代码释义

  • 使用了 ChromeDriverManager 来处理 chromedriver.exe 驱动的问题
  • 考虑到驱动 和 js文件的问题,webdriver_pathjs_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支持的各种定位方式!!!
可定位一个&多个节点、点击节点、文本输入、判断元素是否存在等~

代码

代码释义

  • waitvalue 为必选参数,其余的都是可选参数;
  • by 默认的定位方式是 XPATH,可以传入其它定位方式,如 id, name 等;
  • methodclickinput,再加上默认的 定位,已经可以覆盖99%的节点操作;
  • keyinput 时候的文本内容,使用pyperclipkey复制到剪切板,然后执行键盘事件进行 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被网站发现的问题;
  • 简单封装,针对定位节点、点击节点、输入文本等操作做了封装,并且针对代码给出了详细的注释。

优雅,实在是优雅!!!

后话

本次分享到此结束,
see you~~🐱‍🏍🐱‍🏍

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python基础----03-----if语句、while、for循环、range语句、continue和break

一 布尔类型和比较运算符 1.1 布尔类型和比较运算符 定义变量存储布尔类型数据:变量名称 布尔类型字面量。 布尔类型不仅可以自行定义同时也可以通过计算的来。也就是使用比较运算符进行比较运算得到布尔类型的结果。在C/C中,比较运算符称之为关系运算…

如何解决航空企业数字化转型中的痛点?

数字化时代,越来越多的企业开始关注数字技术,希望通过数字化改造提高企业效率和竞争力,为企业创造更多的商机和利润。今天就来同大家探讨航空领域,小程序在企业数字化转型中发挥的作用、 航空业员工端App的敏捷转型挑战 技术上的…

Java 异常机制:是Java 提供的一种识别及响应错误的一致性机制。

。 目录 友情提醒第一章、异常概述1.1)我们常说的异常是什么1.2)异常的作用1.3)Java异常体系和分类1.4)演示异常的产生 第二章、定义异常与抛出异常:throw2.1)自定义异常类:继承Exception或Run…

网络io与io多路复用select/poll/epoll

一、网络IO请求 网络I/O请求是指在计算机网络中,向其他主机或服务器发送请求或接收响应的操作。这些请求可以包括获取网页、下载文件、发送电子邮件等。网络I/O请求需要使用合适的协议和通信方式来进行数据传输,例如HTTP、FTP、SMTP等。 要完成一个完整…

字节面试过了,薪资都谈好了20K*13,结果挂在这里....

一般提到面试,肯定都会想问一下面试结果,我就大概的说一下面试结果,哈哈,其实不太想说,因为挺惨的,并没有像很多大佬一样 ”已拿字节阿里腾讯各大厂offer”,但是毕竟是自己的经历,无…

让效果图渲染做到最佳的几个小诀窍

制作出优秀的效果图需要多方面的技术支持,而渲染是其中非常关键的一步。一份精美的效果图需要经过高质量的渲染才能呈现出最佳的效果。本文将分享一些关于如何让效果图渲染做到最佳的小诀窍,包括专注的小细节、优化场景设置和灯光、纹理、图像应用最终修…

医疗电子红外线人体额温枪方案

在当前新冠疫情背景下,红外线人体额温枪成为疫情防控必备的设备之一。红外线人体额温枪采用红外线技术,无需接触人体,通过测量人体表面温度来判断人体是否发热。其测量快速、准确、不接触等特点,使其广泛应用于机场、车站、医院、…

数据结构之二叉树(Java)

在这里先说明一下,结点和节点其实一样的,无须关注这个。 一、树型结构 1. 概念:树是一种非线性的数据结构,它是由n个有限节点组成一个具有层次关系的集合。 如上图所示,把此种数据结构称作树是因为它看起来像一个倒挂…

校园高校教务选课成绩系统node.js+vue

系统主要实现了以下功能模块: 学籍信息 网上选课 网上评教,即对自己老师评分 任务查询,老师可以给学生发布任务(类似于作业,考试) 课表查询,希望有个图形化的课表,而不是表格式 教室…

Mysql InnoDB的Buffer Pool

Buffer Pool 在MySQL服务器启动的时候就向操作系统申请了⼀⽚连续的内存,他们给这⽚内存起了个名,叫做Buffer Pool(中⽂名 是缓冲池)。 默认情况下Buffer Pool只有128M⼤⼩,最⼩值为5M,通过修改配置文件设…

【Linux开发—多进程编程】

【Linux开发—多进程编程】 前言1,两种类型的服务端2,并发服务器的实现方法: 一,认识及应用1,进程认识2,CPU核的个数与进程数3,进程ID4,进程创建5, 调用fork函数后的程序运行流程: 二…

一文了解PWA——Progressive Web App

近年来,出现了一种新的应用开发模式——PWA(Progressive Web App,即渐进式Web应用)。今天就来为大家分享什么是PWA,以及它与小程序的区别、技术原理。 PWA的基本概念和技术原理 PWA是一种基于Web技术的应用开发模式&a…

基于CC2530设计智慧农业控制系统

一、项目背景 智慧农业是近年来发展迅速的领域,其目的是利用先进的传感技术、物联网技术和云计算技术等,实现自动化、智能化的农业生产管理,并提高农业生产效率和质量。本文基于CC2530设计了一种智慧农业控制系统,采用DHT11模块、BH1750模块和土壤湿度传感器等传感器,通过…

turtle和matplotlib画画:圆形、爱心

马上就要到六一儿童节了,小朋友很喜欢画画,这里就用Pyhton来画一些简单形状: 用turtle画圆形 import turtle# 设置画笔颜色和粗细 turtle.pencolor("black") turtle.pensize(5)# 绘制一个半径为100的圆形 turtle.circle(100)# 隐藏…

jsonp的实现原理

什么是跨域: 跨域是浏览器同源策略而产生的,在不同协议,不同端口,不同域名下(以上任意一个不同都算是跨域)的客服端和服务端之间是无法互相访问的。 举例: http://www.baidu.com/index.html …

Springboot +spring security,前后端分离时的security处理方案(一)

一.简介 在前后端分离这样的开发模式下,前后端的交互都是通过 JSON 来进行数据传递的,无论登录成功还是失败,都不会有服务端跳转或者客户端跳转之类的操作。 也就是说无论登录成功还是失败,服务端都会返回一段登录成功或失败的 …

与传统序列化比,PB更快更节省空间

文章目录 为何选择PBPB安装WindowsMac未完待续 语法命令行编译Maven插件编译UDP通信的例子 3大序列化方法对比 为何选择PB 在网络传输和存储数据的时候比传统的 JSON 效果更好 PB安装 GitHub Windows 下载 配置环境变量 验证 Mac未完待续 后续补充Mac安装方式 语法 使用过…

Word、Excel、PPT题库——“办公自动化”

小雅兰期末加油冲冲冲!!! 1.【单选题】下列文件扩展名,不属于Word模板文件的是( A )。 A. .DOCX B. .DOTM C. .DOTX D. .DOT 本题的考查点是word基本知识的了解。 .DOCX:word文档。 .DOTM:启…

目标检测:RPN — Faster R-CNN 的主干

动动发财的小手,点个赞吧! 在使用 R-CNN 的目标检测中,RPN 是真正的主干,并且到目前为止已被证明非常有效。它的目的是提出在特定图像中可识别的多个对象。 这种方法是由 Shaoqing Ren、Kaiming He、Ross Girshick 和 Jian Sun 在…

Pandas 28种常用方法使用总结

Pandas库专为数据分析而设计,它是使Python成为强大而高效的数据分析环境的重要因素。它提供了多种数据结构和方法来处理和分析数据。下面是一些Pandas常用方法的使用总结。 1. 创建数据框 使用read_csv()或read_excel()方法读取数据文件,也可以使用Dat…