上篇文章《python+selenium+pytesseract识别图片验证码》对验证码进行识别后,应用到具体实例过程中,发现该算法识别可能会出现识别错误或者没有输出结果的情况,所以在具体应用时需要对验证码输入代码进行优化。
一、剪切验证码图片
将验证码剪切部分提出成一个单独的方法,方便调用
from io import BytesIO
from test.testBefore.testDriver import driver
from PIL import Image
def cut(xpath):
element = driver.find_element_by_xpath(xpath)
x, y = element.location.values()
h, w = element.size.values()
image_data = driver.get_screenshot_as_png()
screenshot = Image.open(BytesIO(image_data))
result = screenshot.crop((x, y, x + w, y + h))
result.save('./VerifyCode.png')
return result
二、图片处理
参考上篇文章的test_pytesseract.py 《python+selenium+pytesseract识别图片验证码》
三、验证码识别实例
如果弹窗提示“验证码错误!”或“验证码必须填写!”等提示,则使用goto方法重新对验证码进行处理。goto方法使用可以参考python3 使用 goto 跳转执行指定代码行
from goto import with_goto
import time
from test.testBefore.testDriver import driver
from test.util.test_pytesseract import recognize
from test.util.test_cut import cut
'''
/处理验证码
'''
label.begin
cut('//*[@id="imgVerifyCode"]')
code = recognize('verifyCode.png')
driver.find_element_by_xpath('//*[@id="txtcode"]').send_keys(code)
'''
处理验证码/
'''
driver.find_element_by_xpath('/html/body/div/div[2]/div[2]/div/div[2]/div/input').click()
time.sleep(1)
try:
if driver.switch_to_alert().text == '验证码错误!':
driver.switch_to.alert.accept()
goto.begin
elif driver.switch_to_alert().text == '验证码必须填写!':
driver.switch_to.alert.accept()
driver.find_element_by_xpath('//*[@id="imgVerifyCode"]').click()
goto.begin
except:
pass
- 注意:实例中的定位元素和弹窗输出需要根据不同项目进行修改。
|