python selenium UI自动化解决验证码的4种方法
作者:地空神一 发布时间:2022-10-09 20:43:06
本文介绍了python selenium UI自动化解决验证码的4种方法,分享给大家,具体如下:
测试环境
windows7+
firefox50+
geckodriver # firefox浏览器驱动
python3
selenium3
selenium UI自动化解决验证码的4种方法:去掉验证码、设置万能码、验证码识别技术-tesseract、添加cookie登录,本次主要讲解验证码识别技术-tesseract和添加cookie登录。
1. 去掉验证码
去掉验证码,直接通过用户名和密码登陆网站。
2. 设置万能码
设置万能码,就是不管什么情况,输入万能码,都可以成功登录网站。
3. 验证码识别技术-tesseract
准备条件
tesseract,下载地址:https://github.com/parrot-office/tesseract/releases/tag/3.5.1
Python3.x,下载地址:https://www.python.org/downloads/
pillow(Python3图像处理库)
安装好Python,通过pip install pillow安装pillow库。然后将tesseract中的tesseract.exe和testdata文件夹放到测试脚本所在目录下,testdata中默认有eng.traineddata和osd.traineddata,如果要识别汉语,请自行下载对应包。
以下是两个主要文件,TesseractPy3.py是通过python代码去调用tesseract以达到识别验证码的效果。code.py是通过selenium获取验证码图片,进而使用TesseractPy3中的函数得到验证码,实现网站的自动化登陆。
TesseractPy3.py
#coding=utf-8
import os
import subprocess
import traceback
import logging
from PIL import Image # 来源于Pillow库
TESSERACT = 'tesseract' # 调用的本地命令名称
TEMP_IMAGE_NAME = "temp.bmp" # 转换后的临时文件
TEMP_RESULT_NAME = "temp" # 保存识别文字临时文件
CLEANUP_TEMP_FLAG = True # 清理临时文件的标识
INCOMPATIBLE = True # 兼容性标识
def image_to_scratch(image, TEMP_IMAGE_NAME):
# 将图片处理为兼容格式
image.save(TEMP_IMAGE_NAME, dpi=(200,200))
def retrieve_text(TEMP_RESULT_NAME):
# 读取识别内容
inf = open(TEMP_RESULT_NAME + '.txt','r')
text = inf.read()
inf.close()
return text
def perform_cleanup(TEMP_IMAGE_NAME, TEMP_RESULT_NAME):
# 清理临时文件
for name in (TEMP_IMAGE_NAME, TEMP_RESULT_NAME + '.txt', "tesseract.log"):
try:
os.remove(name)
except OSError:
pass
def call_tesseract(image, result, lang):
# 调用tesseract.exe,将识读结果写入output_filename中
args = [TESSERACT, image, result, '-l', lang]
proc = subprocess.Popen(args)
retcode = proc.communicate()
def image_to_string(image, lang, cleanup = CLEANUP_TEMP_FLAG, incompatible = INCOMPATIBLE):
# 假如图片是不兼容的格式并且incompatible = True,先转换图片为兼容格式(本程序将图片转换为.bmp格式),然后获取识读结果;如果cleanup=True,操作之后删除临时文件。
logging.basicConfig(filename='tesseract.log')
try:
try:
call_tesseract(image, TEMP_RESULT_NAME, lang)
text = retrieve_text(TEMP_RESULT_NAME)
except Exception:
if incompatible:
image = Image.open(image)
image_to_scratch(image, TEMP_IMAGE_NAME)
call_tesseract(TEMP_IMAGE_NAME, TEMP_RESULT_NAME, lang)
text = retrieve_text(TEMP_RESULT_NAME)
else:
raise
return text
except:
s=traceback.format_exc()
logging.error(s)
finally:
if cleanup:
perform_cleanup(TEMP_IMAGE_NAME, TEMP_RESULT_NAME)
code.py
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
from PIL import Image
import unittest, time, re
from TesseractPy3 import *
class lgoin(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Ie()
self.driver.implicitly_wait(30)
self.base_url = 'http://127.0.0.1:8080/test' # 要测试的链接
self.title = '某管理平台' # 测试网站的Title
self.verificationErrors = []
self.accept_next_alert = True
def test_lgoin(self):
driver = self.driver
driver.get(self.base_url)
driver.maximize_window()
driver.save_screenshot('All.png') # 截取当前网页,该网页有我们需要的验证码
imgelement = driver.find_element_by_class_name('kaptchaImage')
location = imgelement.location # 获取验证码x,y轴坐标
size = imgelement.size # 获取验证码的长宽
rangle = (int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height'])) # 写成我们需要截取的位置坐标
i = Image.open("All.png") # 打开截图
result = i.crop(rangle) # 使用Image的crop函数,从截图中再次截取我们需要的区域
result.save('result.jpg')
text = image_to_string('result.jpg', 'eng').strip()
assert self.title in driver.title
driver.find_element_by_id(u'userCode').clear()
driver.find_element_by_id(u'userCode').send_keys('XXXXXX') # 用户名
driver.find_element_by_id(u'password').clear()
driver.find_element_by_id(u'password').send_keys('XXXXXX') # 密码
#driver.find_element_by_name('verifyCode').clear()
driver.find_element_by_name('verifyCode').send_keys(text)
driver.find_element_by_name('submit').submit()
def is_element_present(self, how, what):
try: self.driver.find_element(by=how, value=what)
except NoSuchElementException as e: return False
return True
def is_alert_present(self):
try: self.driver.switch_to_alert()
except NoAlertPresentException as e: return False
return True
def close_alert_and_get_its_text(self):
try:
alert = self.driver.switch_to_alert()
alert_text = alert.text
if self.accept_next_alert:
alert.accept()
else:
alert.dismiss()
return alert_text
finally: self.accept_next_alert = True
def tearDown(self):
#self.driver.quit()
self.assertEqual([], self.verificationErrors)
if __name__ == "__main__":
unittest.main()
最后,执行命令python code.py,就可以成功自动登录网站。
注意:
由于受验证码图片质量以及清晰度的影响,并不是每一次都能成功登陆。
4. 添加cookie登录
首先获取网站登陆后的cookie,然后通过添加cookie的方式,实现网站登陆的目的。我们用cook来表示xxxxxx的登录后的cookie。
# coding=utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.xxxxxx.com/") # 要登陆的网站
driver.add_cookie(cook) # 这里添加cookie,有时cookie可能会有多条,需要添加多次
time.sleep(3)
# 刷新下页面就可以看到登陆成功了
driver.refresh()
注意:
登录时有勾选下次自动登录的请勾选,浏览器提示是否保存用户密码时请选择确定,这样获取的cookie成功登陆的机率比较高
来源:https://www.jianshu.com/p/97868d722e14


猜你喜欢
- Python 多进程和数据传递的理解python不仅线程用的是系统原生线程,进程也是用的原生进程进程的用法和线程大同小异import mul
- Pynimate介绍Pynimate是python第三方用于动态可视化的数据模块。安装pip install pynimate实验示例fro
- 如果要在某个数组中删除一个元素,可以直接用的unset,但今天看到的东西却让我大吃一惊<?php$arr = array('a
- 上一篇:微软建议的ASP性能优化28条守则(8)技巧 28:阅读资源链接下面是一些与性能有关的出色的资源链接。如果您想了解有关信息,请阅读
- 为了能够在Visual Studio 中集成Mysql, 首先需要安装MySql的连接工具 与 MySql的VisualStudio插件。M
- 前言在浏览博客时,偶然看到了用python将汉字转为拼音的第三方包,但是在实现的过程中发现一些参数已经更新,现在将两种方法记录一下。xpin
- 一、什么是XSS攻击xss攻击:----->web注入xss跨站脚本攻击(Cross site script,简称xss)是一种“HT
- 1.os 库基本介绍os库提供通用的、基本的操作系统交互功能。三大操作系统:windowsMac OSLinuxos 库是python标准库
- 使用了Python的 xml.etree.ElementTree 库xml.etree.ElementTree 库简介xml.etree.E
- 本文实例讲述了php版银联支付接口开发的方法。分享给大家供大家参考,具体如下:支付接口现在有第三方的支付接口也有银行的支付接口。这里就来介绍
- 函数最重要的目的是方便我们重复使用相同的一段程序。将一些操作隶属于一个函数,以后你想实现相同的操作的时候,只用调用函数名就可以,而不需要重复
- 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下:import re s = "how19
- 在JS中要判断一个值是否在数组中并没有函数直接使用,如PHP中就有in_array()这个函数。但我们可以写一个类似in_array()函数
- RIFF file formatRIFF全称为资源互换文件格式(Resources Interchange File Format),是Wi
- /r的用法与end=""用法 \r 表示将光标的位置回退到本行的开头位置end="" 意思
- 创建数据库CREATE DATABASE 语法用于创建一个数据库。语法: PHP MySQL 函数库中,mysql_query()
- 一、什么是 Postman(前世今生)Postman 诞生于 2013 年,一开始只是 Abhinav Asthana 着手于解决 API
- 一)安装scrapy:1、打开cmd命令窗口,输入:pip install Scrapy。2、安装成功之后会显示下面字符,表示未将scrap
- 用pycharm进行debug① 直接在代码中设断点(点击代码的左边)②右击点击debug有几种debug方式,我们可以在pycharm的下
- SQLPrompt是Sql Server 开发智能提示插件,方便查询表结果,避免了开发人员一个个敲查询语句、执行语句等,下面带大家仔细了解一