selenium UI自动化解决验证码的五种方法
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)
#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()
# 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()
BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream("/Users/pangyongjuan/IdeaProjects/Zmbx/src/test/java/code.txt")));
String code = null;
while((code = reader.readLine()) != null){
System.out.println("验证码是:---->"+ code);
driver.findElement(By.id("pin")).sendKeys(code);
}
selenium UI自动化解决验证码的五种方法的更多相关文章
- Selenium UI自动化解决iframe定位问题
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6735116.html 一个阴雨霏霏 ...
- 自动化测试系列:Selenium UI自动化解决iframe定位问题
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6735116.html 一个阴雨霏霏 ...
- html table表格导出excel的方法 html5 table导出Excel HTML用JS导出Excel的五种方法 html中table导出Excel 前端开发 将table内容导出到excel HTML table导出到Excel中的解决办法 js实现table导出Excel,保留table样式
先上代码 <script type="text/javascript" language="javascript"> var idTmr; ...
- HTML实现页面自动跳转的五种方法
下面列了五个例子来详细说明,这几个例子的主要功能是:在5秒后,自动跳转到同目录下的hello.html(根据自己需要自行修改)文件. 1)html的实现 复制代码 代码如下: <head> ...
- centos7防暴力破解五种方法
什么是暴力破解,简单来说就是对一个服务器进行无数次尝试登陆,并用不同的密码进行登陆直到可以登陆成功.暴力破解的基本步骤可以分为以下几步: 1. 找到对应的linux服务器 Ip地址 2.扫描端口 ...
- HTML 页面跳转的五种方法
H方法TML 页面跳转的五种方法 下面列了五个例子来详细说明,这几个例子的主要功能是:在5秒后,自动跳转到同目录下的hello.html(根据自己需要自行修改)文件.1) html的实现 <he ...
- Android之数据存储的五种方法
1.Android数据存储的五种方法 (1)SharedPreferences数据存储 详情介绍:http://www.cnblogs.com/zhangmiao14/p/6201900.html 优 ...
- Java 字符串拼接 五种方法的性能比较分析 从执行100次到90万次
[请尊重原创版权,如需引用,请注明来源及地址] > 字符串拼接一般使用“+”,但是“+”不能满足大批量数据的处理,Java中有以下五种方法处理字符串拼接,各有优缺点,程序开发应选择合适的方法实现 ...
- js去掉字符串前后空格的五种方法
转载 :http://www.2cto.com/kf/201204/125943.html 第一种:循环检查替换[javascript]//供使用者调用 function trim(s){ ret ...
随机推荐
- Codeforces 380E Sereja and Dividing
题面 洛谷传送门 题解 博客 有精度要求所以只用求几十次就差不多了 CODE #include <bits/stdc++.h> using namespace std; typedef l ...
- php数据类型之浮点型
所谓浮点类型,可以理解为:我们数学里面的小数. [注意]关于精度.取值范围和科学型声明不是学习的重点.因为此块在实际开发中用的特别少.我们将此块的知识点的学习标注为,了解级别.直线电机滑台 声明方式分 ...
- sql server update 的批量更新方法
假定我们有两张表,一张表为Product表存放产品信息,其中有产品价格列Price:另外一张表是ProductPrice表,我们要将ProductPrice表中的价格字段Price更新为Price表中 ...
- Spring security invalid-session-url 的坑(配了permitAll仍然跳转到登录页)
Spring security session配置中如果配了如下的invalid-session-url,配置了permitAll链接首次链接系统时会跳转到登录页,将该配置删除即可解决此问题. < ...
- OSS的简单使用
OSS简介 Object Storage Service,简称 OSS,是阿里云提供的海量.安全.低成本.高可靠的云存储服务. 它具有与平台无关的RESTful API接口,能够提供99.999999 ...
- decodeURI 与 decodeURIComponent 区别
1. 关于URL.encodeURI 及 encodeURIComponent: URI: Uniform Resource Identifiers,通用资源标识符 Global 对象的 encode ...
- Python基础之可接受任意数量参数的函数
1. 可接受任意数量位置参数的函数 为了能让一个函数接受任意数量的位置参数,可以在参数部分使用“*”. def avg(first, *rest): return (first + sum(rest) ...
- [线性代数] 矩阵代数基础 Basic Matrix Algebra
Overview: Matrix algebra Matrix algebra covers rules allowing matrices to be manipulated algebraical ...
- Android Studio如何删除一个Module
当你想在Android Studio中删除某个module时,大家习惯性的做法都是选中要删除的module,右键去找delete.但是在Android Studio中你选中module,右键会发现没 ...
- 【linux】保存屏幕日志log
例如: #!/bin/bash #LOG="examples/mnist/lenet_log_mylog" LOG="LOG/log.txt.`date +'%Y-%m- ...