使用muggle_ocr处理selenium登录管理后台验证码问题

在使用selenium登录管理后台时,会遇到验证码问题,若验证码相对简单,则可以使用图像识别开源库muggle_ocr来识别验证码

使用muggle_ocr处理selenium登录管理后台验证码问题

如果图像有上图那么简单,则可以使用如下代码,你只要修改其中的定位元素即可使用。解决思路如下:

1、muggle_ocr自带有识别4-6位简单验证码的模型,识别上述类型验证码的成功率为28%

2、虽然成功率很低,但我们可以通过不停地刷新、识别、输入验证码,直到验证码输入成功

3、经过多次测试,最多只需尝试8次就能登录成功,效果算很不错了。

4、如果你想提高识别率,则可以进入开源项目https://github.com/kerlomz/captcha_trainer,自行训练模型。

from selenium import webdriver
import time
import muggle_ocr
import base64
#登录url
login_url="xxxxxxxxxxxxxx"
browser=webdriver.Chrome()
browser.get(url=login_url)
login_username="xxxxxx"
browser.find_element_by_xpath('//*[@id="app"]/div/form/div[2]/div/div/input').send_keys(login_username)
browser.find_element_by_xpath('//*[@id="app"]/div/form/div[3]/div/div/input').send_keys("xxxxx")
time.sleep(1)
def auto_fill_captcha():
    #要求版本tensorflow==1.15.5,muggle-ocr==.0.3
    #通过url判断当前是不是登录页面,是就执行登录操作,不是就代表登录成功
    print("开始登录.....")
    i=0
    while browser.current_url==login_url:
        if i!=0:
            #刷新验证码并清空验证码输入框
            browser.find_element_by_xpath('//*[@id="app"]/div/form/div[4]/div/img').click()
            browser.find_element_by_xpath("//div[@id='app']/div[@class='login-container']/form//input[@name='code']").clear()
            time.sleep(1)
        # 获取、填写验证码,点击登录按钮
        #获取验证码,因为其是base64编码方式的,需要先转换为字节类型,方便后面muggle_ocr使用
        src = browser.find_element_by_xpath('//*[@id="app"]/div/form/div[4]/div/img').get_attribute("src")
        src = src.replace("data:image/jpg;base64,", "")
        missing_padding = 4 - len(src) % 4
        if missing_padding:
            src += '=' * missing_padding
        image = base64.b64decode(src)
        print(image)
        # muggle_ocr中的ModelType.Captcha方法 可识别4-6位验证码
        sdk = muggle_ocr.SDK(model_type=muggle_ocr.ModelType.Captcha)
        st = time.time()
        # 调用预测函数
        text = sdk.predict(image_bytes=image)
        print(text, time.time() - st)
        #填入验证码
        browser.find_element_by_xpath("//div[@id='app']/div[@class='login-container']/form//input[@name='code']").send_keys(
            text)
        #点击登录
        browser.find_element_by_xpath("//div[@id='app']//form//span[.='登录']").click()
        time.sleep(3)
        i+=1
    print("登录成功,总计用了 {} 次".format(i))

灵感来源文章链接,https://www.jianshu.com/p/1e6430b1c4d7

muggle_ocr开源项目https://github.com/kerlomz/captcha_trainer

上一篇:自动化构建初体验


下一篇:Python自动化测试工具Splinter简介和使用实例