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. Spring第四天

    顾问包装通知 通知(advice)是Spring中的一种比较简单的切面,只能将切面织入到目标类的所有方法中,而无法对指定方法进行增强 顾问(advisor)是Spring提供的另外一种切面,可以织入到 ...

  2. Navicat连接Oracle报ORA-12737错误

    替换oci.dll 文件分享百度网盘:链接:https://pan.baidu.com/s/1wayojGlKcgdMRZTvBqAUgw 密码:3d6j 把下载的文件放到Navicat文件夹里,然后 ...

  3. 三十.数据库服务概述 构建MySQL服务器 、 数据库基本管理 MySQL数据类型

    mysql50:192.168.4.50 1.构建MySQL服务器 安装MySQL-server.MySQl-client软件包 修改数据库用户root的密码 确认MySQL服务程序运行.root可控 ...

  4. RDMA Programming - Base on linux-rdma

    RDMA Programming - Base on linux-rdma 首页分类标签留言关于订阅2017-11-08 | 分类 Network  | 标签 RDMA  RoCE  Linux-RD ...

  5. Lua 常用函数 一

    lua_getallocf lua_Alloc lua_getallocf (lua_State *L, void **ud); 返回给定状态机的内存分配器函数.如果 ud 不是 NULL ,Lua ...

  6. Jedis API操作redis数据库

    1.配置文件 classpath路径下,新建redis.properties配置文件 配置文件内容 # Redis settings redis.host=127.0.0.1 redis.port=6 ...

  7. Vue-cli 构建项目后 npm run build 如何在本地运行查看

    当你在本地直接打开index.html 你会发现了一丢丢404,这时候你有两个办法解决问题: 1:改变路径为相对路径. 在config 文件夹中index.js的 build对象里, 把 assets ...

  8. Android中View大小的确定过程

    View and ViewGroup 安卓中有5种基本的 ViewGroup: FrameLayout RelativeLayout LinearLayout TableLayout Absolute ...

  9. mybatis-generator-gui如何打包成exe

    快速阅读: ​ 用wix和inno setup把mybatis-generator-gui 打包成exe和安装文件. 以后使用的时候方便,不用每次打开eclipse运行. 使用inno setup 5 ...

  10. flask上下文流程面试总结