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自动化解决验证码的五种方法的更多相关文章

  1. Selenium UI自动化解决iframe定位问题

      更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6735116.html 一个阴雨霏霏 ...

  2. 自动化测试系列:Selenium UI自动化解决iframe定位问题

      更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6735116.html 一个阴雨霏霏 ...

  3. 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; ...

  4. HTML实现页面自动跳转的五种方法

    下面列了五个例子来详细说明,这几个例子的主要功能是:在5秒后,自动跳转到同目录下的hello.html(根据自己需要自行修改)文件. 1)html的实现 复制代码 代码如下: <head> ...

  5. centos7防暴力破解五种方法

    什么是暴力破解,简单来说就是对一个服务器进行无数次尝试登陆,并用不同的密码进行登陆直到可以登陆成功.暴力破解的基本步骤可以分为以下几步: 1. 找到对应的linux服务器    Ip地址 2.扫描端口 ...

  6. HTML 页面跳转的五种方法

    H方法TML 页面跳转的五种方法 下面列了五个例子来详细说明,这几个例子的主要功能是:在5秒后,自动跳转到同目录下的hello.html(根据自己需要自行修改)文件.1) html的实现 <he ...

  7. Android之数据存储的五种方法

    1.Android数据存储的五种方法 (1)SharedPreferences数据存储 详情介绍:http://www.cnblogs.com/zhangmiao14/p/6201900.html 优 ...

  8. Java 字符串拼接 五种方法的性能比较分析 从执行100次到90万次

    [请尊重原创版权,如需引用,请注明来源及地址] > 字符串拼接一般使用“+”,但是“+”不能满足大批量数据的处理,Java中有以下五种方法处理字符串拼接,各有优缺点,程序开发应选择合适的方法实现 ...

  9. js去掉字符串前后空格的五种方法

    转载 :http://www.2cto.com/kf/201204/125943.html 第一种:循环检查替换[javascript]//供使用者调用  function trim(s){  ret ...

随机推荐

  1. 入门: 在Windows上搭建Flutter开发环境

    使用镜像 由于在国内访问Flutter有时可能会受到限制,Flutter官方为中国开发者搭建了临时镜像,大家可以将如下环境变量加入到用户环境变量中: export PUB_HOSTED_URL=htt ...

  2. 通过ResultSet获取到rs的记录数的几种方法

    方法一:利用ResultSet的getRow方法来获得ResultSet的总行数 ResultSet rs = ps.executeQuery(sql); rs.last(); //移到最后一行 in ...

  3. 在默认使用apache中央仓库时, 报错 protocol_version

    https://cloud.tencent.com/developer/ask/136221/answer/241408 2018年6月,为了提高安全性和符合现代标准,不安全的TLS 1.0和1.1协 ...

  4. DES 加密 转码 脱敏

    from pyDes import des, CBC, PAD_PKCS5 import binascii # 秘钥 KEY = 'mHAxsLYz' from pyDes import des, C ...

  5. 在Spring中读取properties文件

    1.配置文件(*.properties)往往通过以下方式注册在Spring IOC中. <!-- JDBC配置 --> <context:property-placeholder l ...

  6. centos7 安装 mysql5.6(MySQL-5.6.44-1.el7.x86_64.rpm-bundle.tar)

    1.卸载MariaDB rpm -qa | grep -i mariadb rpm -e --nodeps mariadb-libs--.el7.x86_64 2.卸载已有Mysql 卸载旧版本mys ...

  7. 判断声明出来的list为空的时候,list!=null

    判断声明出来的list为空的时候,listjcxm!=null&&listjcxm.size()==0: 有时候list不为null但是size为0 map也是类似

  8. go无缓冲通道

    package main import ( "fmt" "math/rand" "sync" "time" ) //wg ...

  9. 2.linux的增删改查

    一.增删改查       1.建立文件和目录         mkdir /tmp/xueying       2.cd 进入的路径         绝对路径:以根目录为其实目录的路径         ...

  10. SSH 三大框架整合

    Spring整合web项目 在Servlet当中直接加载配置文件,获取对象 存在问题 每次请求都会创建一个Spring的工厂,这样浪费服务器资源,应该一个项目只有一个Spring的工厂. 在服务器启动 ...