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

news2024/11/14 2:24:26

前言

近来又用上了 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被网站发现的问题;

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

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

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

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

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

相关文章

【杂谈分享】关于我去HVV当猴子这件事——HVV日记

目录 前言 序幕 开局 入世 破妄 终章 前言 今年第一次参加HVV行动。去当蓝队专家(cai niao)。大概是六月末,领导说今年的HVV派我去参加。毕竟是第一次参加,因此虽然可能就没办法放假了,而且也没有额外工资&…

python基础教程:re模块用法详解

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 一、正则表达式的特殊字符介绍 正则表达式 👇 👇 👇 更多精彩机密、教程,尽在下方,赶紧点击了解吧~ 素材、视频教程、完整代码、插件安装教程我都准备好了&a…

【Linux】进程状态|僵尸进程|孤儿进程

前言 本文继续深入讲解进程内容——进程状态。 一个进程包含有多种状态,有运行状态,阻塞状态,挂起状态,僵尸状态,死亡状态等等,其中,阻塞状态还包含深度睡眠和浅度睡眠状态。 个人主页&#xff…

SQL Server软件安装包分享

目录 一、软件简介 二、软件下载 一、软件简介 SQL Server是一种关系型数据库管理系统,由美国微软公司开发。它被设计用于存储、管理和查询数据,被广泛应用于企业级应用、数据仓库和电子商务等场景。 以下是SQL Server软件的主要特点和功能&#xff1…

STM32 BOOT 启动配置 ISP升级 介绍

启动配置 在STM32F10xxx里,可以通过BOOT[1:0]引脚选择三种不同启动模式。 启动模式选择引脚启动模式说明BOOT1BOOT0X0主闪存存储器主闪存存储器被选为启动区域01系统存储器系统存储器被选为启动区域11内置SRAM内置SRAM被选为启动区域 在系统复位后, S…

java八股文面试[多线程]——有几种创建线程的方式

this逃逸问题:构造器中启动线程。 面试题: 用Thread和Runable创建线程的差别 一、Runnable和Thread的区别 继承性:Thread是一个类,因此如果继承Thread类,子类就不能再继承其他的类了,而实现Runnable接口…

JavaFX 加载 fxml 文件

JavaFX 加载 fxml 文件主要有两种方式,第一种方式通过 FXMLLoader 类直接加载 fxml 文件,简单直接,但是有些控件目前还不知道该如何获取,所以只能显示,目前无法处理。第二种方式较为复杂,但是可以使用与 fx…

mysql 逻辑架构

连接层 客户端和服务器建立连接,客户端发送sql 到 服务器端 服务层 引擎层 查看现有的 存储引擎 show engines; 存储层

电子器件系列56:ltc1799(定时器)

定时IC芯片是一种具有定时功能的集成电路,常用于计时、时钟、频率合成等应用。以下是一些常见的定时IC芯片: 1. 555定时器芯片:最常见的定时IC芯片之一,可用于产生各种定时信号和脉冲。 2. 556双555定时器芯片:由两个5…

OLED透明屏曲面技术:创新突破引领显示行业未来

OLED透明屏曲面技术作为一项重要的显示技术创新,正在成为显示行业的焦点,其引人注目的优势和广泛应用领域使其备受关注。 本文将详细介绍OLED透明屏曲面技术的优势、应用领域以及市场前景,同时展望其未来的发展趋势,以期带给读者…

数据工厂调研及结果展示

数据工厂 一、背景 在开发自测、测试迭代测试、产品验收的过程中,都需要各种各样的前置数据,大致分为如下几类: 账号(实名、权益等级、注册等) 货源(优货、急走、相似、一手、普通货源等) …

Linux下Qt配置opencv环境(ippicv,ffmpeg手动配置)

1.opencv配置使用问题 opencv在cmake的时候有两个问题,ippicv长时间卡住下载失败,ffmpeg不会卡住但是也不会配置成功。所以这两个包只能手动下载安装。 ippicv是什么 OpenCV设计用于高效的计算,十分强调实时应用的开发。它由C语言编写并进行了…

腾讯云服务器地域有什么区别?怎么选择合适?

腾讯云服务器地域有什么区别?怎么选择比较好?地域选择就近原则,距离地域越近网络延迟越低,速度越快。关于地域的选择还有很多因素,地域节点选择还要考虑到网络延迟速度方面、内网连接、是否需要备案、不同地域价格因素…

聚观早报 | 青瓷游戏上半年营收3.34亿元;如祺出行冲击IPO

【聚观365】8月26日消息 青瓷游戏上半年营收3.34亿元 如祺出行冲击IPO 索尼互动娱乐将收购Audeze 昆仑万维上半年净利润3.6亿元 T-Mobile计划在未来五周内裁员5000人 青瓷游戏上半年营收3.34亿元 青瓷游戏发布截至2023年6月30日止的中期业绩,财报显示&#xf…

聚类分析 | MATLAB实现基于DBSCAD密度聚类算法可视化

聚类分析 | MATLAB实现基于LP拉普拉斯映射的聚类可视化 目录 聚类分析 | MATLAB实现基于LP拉普拉斯映射的聚类可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于DBSCAD密度聚类算法可视化,MATLAB程序。 使用带有KD树加速的dbscan_with_kdtree函数进行…

AI绘画 | Discord的最强7款AI插件整理汇总

hi,同学们,我是赤辰,本周起,我们将开启AI工具教程篇的栏目,每天会更新1篇AI教程或推荐实用AI工具,文章底部准备了粉丝福利,看完可以领取! 今天给大家整理了Discord的最强7款AI插件汇…

ai课堂行为分析检测评估

ai课堂行为分析检测评估系统通过yolo网络模型算法,ai课堂行为分析检测评估算法利用摄像头采集学生的图像,视线跟踪技术的智能教学系统由情感模型、教师模型、学生模型和课程模型四个模型组成。用户端的视线及表情信息通过摄像头采集并传递到情感模型情感…

日常踩坑记录

本篇文章主要介绍一下最近的开发中用到的些小问题。问题不大,但有些小细节,记录一下,有遇到的朋友可以看一下,有更好的解决方法欢迎分享。 浏览器记住密码自动填充表单 这个问题我在火狐浏览器遇到了。我登录系统时选择了浏览器…

【MySQL系列】统计函数(count,sum,avg)详解

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

SpringBoot源码剖析

SpringBoot概念 什么是SpringBoot spring官方的网站:https://spring.io/ 翻译:通过Spring Boot,可以轻松地创建独立的,基于生产级别的基于Spring的应用程序,并且可以“运行”它们 其实Spring Boot 的设计是为了让你…