Selenium 自动化测试demo
场景描述:
模拟用户登录页面操作,包括输入用户名、密码、验证码。验证码为算数运算,如下:
使用到的工具和依赖:
1. Selenium:pip install selenium
2. 需要安装浏览器驱动:这里使用的是Edge
3.
Pillow: 用来处理图像,例如图像二值化等等4. 图像识别库pytesseract:
3.1 下载安装Tesseract:https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w64-setup-5.3.3.20231005.exe
3.2 配置环境变量
3.3 在pycharm中下载依赖:pip install pytesseract
代码实现:
import base64
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.edge.options import Options
from selenium.webdriver.edge.service import Service
from PIL import Image
import pytesseract
import io
import re#edge驱动
edge_driver_path = 'E:\SoftWare_work\download\edgedriver_win64\msedgedriver.exe'
#浏览器选型配置
edge_options=Options()
#edge_options.add_argument("--headless") 加上该行,代码运行时不会打开浏览器
#启动浏览器
service=Service(edge_driver_path)
driver=webdriver.Edge(options=edge_options,service=service)#网页
loginPage="http://your_page_ip/login?redirect=/index"
driver.get(loginPage)time.sleep(2) #等待加载'''输入用户名、密码、验证码登录'''
user_name=driver.find_element(By.XPATH,"//input[@class='el-input__inner' and @type='text' and @placeholder='用户名']")
user_name.send_keys("username")
password=driver.find_element(By.XPATH,"//input[@class='el-input__inner' and @type='password' and @placeholder='密码']")
password.send_keys("password")
#处理验证码
#1.定位图片
img_elem=driver.find_element(By.CSS_SELECTOR,"div.login-code img.login-code-img")
#2. 获取src属性 base64编码的图片
img_src=img_elem.get_attribute("src")
'''读取图像'''
#2.2 提取base64编码部分
if img_src.startswith("data:image"):img_src=img_src.split(",")[1]
#2.3 解码base64数据
image_data=base64.b64decode(img_src)
#2.4 读取图像
image=Image.open(io.BytesIO(image_data))
image.show()#原图像显示
'''图像处理'''
#转化为灰度图像
image_gray=image.convert("L")
image_gray.show()
#图像二值化处理
threshold_image=image_gray.point(lambda p:p>128 and 255)
#图像显示
threshold_image.show()
'''图像识别'''
text = pytesseract.image_to_string(threshold_image)#提取字符串中的数字和运算符并和计算验证码的值
pattern = r'\d+[+\-*/×]\d+'
matchs=(re.match(pattern,text)).group()
result=0
if matchs.__contains__("+"):num1=matchs.split("+")[0]num2=matchs.split("+")[1]result=int(num1)+int(num2)
elif matchs.__contains__("-"):num1 = matchs.split("-")[0]num2 = matchs.split("-")[1]result = int(num1) - int(num2)
elif matchs.__contains__("*"):num1=matchs.split("*")[0]num2=matchs.split("*")[1]result=int(num1)*int(num2)
else:num1 = matchs.split("/")[0]num2 = matchs.split("/")[1]result = int(num1) / int(num2)
#定位验证码输入框,输入验证码
login_code=driver.find_element(By.XPATH,"//input[@class='el-input__inner' and @type='text' and @placeholder='验证码']")
login_code.send_keys(result)#点击登录
login_button=driver.find_element(By.CSS_SELECTOR,"button")
login_button.click()#关闭网页
driver.quit()
相关文章:
Selenium 自动化测试demo
场景描述: 模拟用户登录页面操作,包括输入用户名、密码、验证码。验证码为算数运算,如下: 使用到的工具和依赖: 1. Selenium:pip install selenium 2. 需要安装浏览器驱动:这里使用的是Edge 3…...
LeetCode 111.二叉树的最小深度
题目: 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 思路:自底向上(归)/自顶向下(递) DF…...
大工C语言作业答案
前言 这里是大连理工大学新版C语言课程MOOC作业的答案。 后期我会把全部的作业答案开源出来,希望对大家有帮助。 第九周第一题 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int B(int i) {int sum 1;while (i > 0){sum i * sum;i--;}return su…...
【Unity踩坑】Unity中父对象是非均匀缩放时出现倾斜或剪切现象
The game object is deformed when the parent object is in non-uniform scaling. 先来看一下现象 有两个Cube, Cube1(Scale2,1,1),Cube2(Scale1,1,1) 将Cube2拖拽为Cube2的子对象。并且将position设置为(-0.6,1,0&a…...
QT 跨平台实现 SSDP通信 支持多网卡
一.多网卡场景 在做SSDP通信的时候,客户端发出M-search命令后, 主机没有捕捉到SSDP的消息,你可以查看下,是不是局域网下,既打开了wifi,又连接了本地网络,mac os下很容易出现这种场景。此时,我们发送消息时,需要遍历所有网卡并发送M-search命令。 二.QT相关接口介绍 1…...
如何寻找适合的HTTP代理IP资源?
一、怎么找代理IP资源? 在选择代理IP资源的时候,很多小伙伴往往将可用率作为首要的参考指标。事实上,市面上的住宅IP或拨号VPS代理IP资源,其可用率普遍在95%以上,因此IP可用率并不是唯一的评判标准 其实更应该关注的…...
数据结构(ArrayList顺序表)
一、引言 1.什么是顺序表 定义: 顺序表是一种基于阵列实现的线性表结构,用连续的存储空间保存表中的数据元素,并按顺序排列。 底层依赖阵列,支持随机访问。元素之间没有额外的连接信息,如指针或链表节点。通过动态扩容…...
直接抄作业!Air780E模组LuatOS开发:位运算(bit)示例
在嵌入式开发中,位运算是一种高效且常用的操作技巧。本文将介绍如何使用Air780E模组和LuatOS进行位运算,并通过示例代码帮助读者快速上手。 一、位运算概述 位运算是一种在计算机系统中对二进制数位进行操作的运算。由于计算机内部数据的存储和处理都是…...
RK3588-LinuxSDK安装
安装依赖软件 执行如下命令,安装 LinuxSDK 开发包依赖软件。 备注:安装过程中,请保证 Ubuntu 可正常访问互联网,若提示"*** is already the newest version ***"表示该软件已安装,请忽略。 Host# sudo apt-get install -y git ssh make gcc libssl-dev \ liblz…...
MATLAB 中有关figure图表绘制函数设计(论文中常用)
在撰写论文时,使用 MATLAB 导出的图像常常因大小和格式不统一,导致投稿时编辑部频繁退稿,要求修改和调整。这不仅浪费时间,也增加了工作量。为了减少这些麻烦,可以在 MATLAB 中导出图像时提前设置好图表的大小、格式和…...
Unity UGUI原理剖析
UI最重要的两部分 UI是如何渲染出来的点击事件如何触发何时发生UI重绘 1:UI如何渲染出来的 UI渲染一定是有顶点的,没有顶点就没法确定贴图的采样,UGUI的顶点在一张Mesh上创建,经过渲染管线UI就渲染到屏幕上了,UI的渲染…...
Spring框架使用xml方式配置ThreadPoolTaskExecutor线程池,并且自定义线程工厂
一、自定义线程工厂 自定义线程工厂需要实现java.util.concurrent.ThreadFactory接口,重写newThread方法。 示例代码: package com.xiaobai.thread;import org.apache.log4j.Logger;import java.util.concurrent.ThreadFactory; import java.util.conc…...
架构-微服务-服务网关
文章目录 前言一、网关介绍1. 什么是API网关2. 核心功能特性3. 解决方案 二、Gateway简介三、Gateway快速入门1. 基础版2. 增强版3. 简写版 四、Gateway核心架构1. 基本概念2. 执行流程 五、Gateway断言1. 内置路由断言工厂2. 自定义路由断言工厂 六、过滤器1. 基本概念2. 局部…...
基于springboot的HttpClient、OKhttp、RestTemplate对比
HttpClient详细 Httpclient基础!!!!实战训练!!!!-CSDN博客 OKhttp使用 OKhttp导包 <!-- ok的Http连接池 --><dependency><groupId>com.squareup.okhttp3</g…...
(计算机组成原理)期末复习
第一章 计算机的基本组成:硬件软件(程序)计算机系统 软件有系统软件(系统管理工具),应用软件 计算机硬件:包括主机和外设,主机包括CPU和内存,***CPU由运算器和控制器所组…...
从0到1部署Tomcat和添加servlet(IDEA2024最新版详细教程)
本文不仅细化了每一个步骤,实现了从0到1部署Tomcat和添加servlet。还针对IDEA2024版和以前的版本在部署上的区别,做了详细介绍,尤其是add framework support部分。与此同时,针对控制台中文乱码问题,本文也给出了详细解…...
【Java从入门到放弃 之 Java程序基础】
Java程序基础 Java程序基础基本数据类型和变量数据类型变量赋值基本运算算术运算比较运算逻辑运算 Java程序基础 基本数据类型和变量 数据类型 对Java语言而言,有如下基本数据类型。 整数类型:有4种整型byte/short/int/long,它们占用的字…...
2024年11月26日Github流行趋势
项目名称:v2rayN 项目维护者:2dust yfdyh000 CGQAQ ShiinaRinne Lemonawa 项目介绍:一个支持Xray核心及其他功能的Windows和Linux图形用户界面客户端。 项目star数:70,383 项目fork数:11,602 项目名称:fre…...
相亲交友小程序项目介绍
一、项目背景 在当今快节奏的社会生活中,人们忙于工作和事业,社交圈子相对狭窄,寻找合适的恋爱对象变得愈发困难。相亲交友作为一种传统而有效的社交方式,在现代社会依然有着巨大的需求。我们的相亲交友项目旨在为广大单身人士提…...
使用ENSP实现默认路由
一、项目拓扑 二、项目实现 1.路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1关闭信息中心 undo info-center enable 进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为2.2.2.1/24 ip address 2.2.2.1 24进入g0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置为1.…...
ComfyUI ControlNet Aux预处理器深度解析:从模型下载到性能优化全攻略
ComfyUI ControlNet Aux预处理器深度解析:从模型下载到性能优化全攻略 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux ComfyUI ControlNet Aux…...
从FinFET到3D-IC:2013年预测如何塑造了今天的低功耗与异构计算设计
1. 项目概述:站在2013年初的十字路口十多年前,2013年初的那个冬天,整个半导体与电子设计自动化行业弥漫着一种既兴奋又焦虑的复杂情绪。当时,我作为行业里的一名技术编辑,向数十位来自芯片设计公司、EDA工具供应商、IP…...
AI命令行自动执行工具:从剪贴板监听、内容过滤到终端注入的实现原理
1. 项目概述:一个让Claude“粘贴”命令行的效率工具如果你经常和Claude这类AI助手对话,并且需要处理命令行操作,那你一定遇到过这个痛点:Claude给出的代码片段、配置命令或者文件路径,你需要手动复制、切换窗口、粘贴到…...
告别手动下载!3步轻松批量获取网易云音乐FLAC无损音乐
告别手动下载!3步轻松批量获取网易云音乐FLAC无损音乐 【免费下载链接】NeteaseCloudMusicFlac 根据网易云音乐的歌单, 下载flac无损音乐到本地.。 项目地址: https://gitcode.com/gh_mirrors/nete/NeteaseCloudMusicFlac 你是不是也遇到过这样的烦恼&#x…...
FreeRTOS CPU使用率统计的坑:为什么你的数据跑了1小时就不准了?
FreeRTOS CPU使用率统计的陷阱与高精度优化方案 当你在嵌入式系统中集成FreeRTOS的CPU使用率统计功能时,可能会遇到一个令人困惑的现象:系统运行约1小时后,统计数值突然出现明显偏差。这不是你的代码出了问题,而是隐藏在32位变量和…...
终极指南:如何使用OpenCore Legacy Patcher让旧款Mac焕发新生
终极指南:如何使用OpenCore Legacy Patcher让旧款Mac焕发新生 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为你的老款Mac无法升级最新macO…...
从零构建FreeRTOS认知:核心概念与实战框架精讲
1. 认识FreeRTOS:嵌入式系统的"交通指挥官" 第一次接触FreeRTOS时,我盯着文档里那些"任务"、"队列"、"调度器"之类的术语发懵,就像刚拿到驾照就被扔进了早高峰的十字路口。后来才发现,这…...
9. 找到字符串中所有字母异位词
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。方法一:哈希表class Solution(object):def findAnagrams(self, s, p):result{}result["".join(sorted(p))][]for i in ra…...
AI小白必看:打好基础再冲大模型,收藏这份学习路线图!
本文针对想学习AI的学生,强调掌握基础的重要性,避免直接进入大模型学习。文章提出应先理解AI的核心是让机器从数据中学习规律,并掌握数学、编程和数据思维能力。建议从数据处理开始,熟悉Python及常用库,逐步学习机器学…...
FPGA/CPLD数字系统设计实战:从器件选型到调试验证的工程指南
1. 从一则行业趣闻聊起:FPGA厂商的“江湖地位”与我们的设计选择前几天翻看一些老旧的行业资料,偶然间又看到了这篇2012年来自EE Times的“陈年旧文”。文章作者Clive Maxfield用他标志性的幽默笔调,聊了一个看似无厘头的话题:将科…...
