selenium 验证码识别
前言:做web端ui自动化,往往会遇到登录需要验证码这个问题,很多时候解决方法是要求前端在非正式环境设置万能验证码或者剔除验证码。但这样不利于测试正常流程,存在漏测或者万能验证码代码发布上线的风险。
所以可以通过ocr、cookic等方法去验证的登录,以下主要说明通过ocr去解决的方法:
注:ddddocr 比较适用于数字这种简单验证码,对于向复杂字符、需要点击验证码内容选择、滑动图片验证这些难度高的,可参考这位大佬:https://wenanzhe.com/
1 driver = webdriver.Chrome() 2 # 通过ddddocr 识别 数字验证码 3 def web_login(): 4 driver.maximize_window() 5 driver.get("https://xxxx.com") 6 time.sleep(5) 7 # 识别完成 输入账户密码/验证码 8 driver.find_element_by_name('user_name').send_keys('username') 9 10 driver.find_element_by_name('password').send_keys('password') 11 12 driver.find_element_by_name('captcha').send_keys(captcha_ocr()) 13 time.sleep(5) 14 15 driver.find_element_by_xpath(element.login.value).click() 16 time.sleep(2) 17 try: 18 # TODO:因为ocr识别不是100%准确,所以可以根据项目来决定重试次数,使用循环来判断更优; 19 if iselement(element.login.value) is not False: 20 log.log_info('第一次输入验证码不正确') 21 captcha_input() 22 if iselement(element.login.value) is not False: 23 log.log_info('第二次输入验证码不正确') 24 captcha_input() 25 if iselement(element.login.value) is not False: 26 log.log_info('第三次输入验证码不正确') 27 captcha_input() 28 except: 29 print('验证码正确,登录成功') 30 31 32 # 当验证码出错,删除已输入的验证码,重新识别输入 33 def captcha_input(): 34 # 因为ocr识别成不是4位数字,造成没有刷新验证码,需要手动刷新一次 35 driver.find_element_by_xpath(element.captcha_img.value).click() 36 # 删除已输入的,重新识别 37 rc = driver.find_element_by_name('captcha') 38 ActionChains(driver).double_click(rc).perform() 39 rc.send_keys(Keys.BACK_SPACE) 40 time.sleep(1) 41 rc.send_keys(captcha_ocr()) 42 time.sleep(1) 43 driver.find_element_by_xpath(element.login.value).click() 44 45 46 # 进行验证码截图,并通过ocr识别验证码信息 47 def captcha_ocr(): 48 driver.find_element_by_xpath(element.captcha_img.value)\ 49 .screenshot('captcha.jpg') 50 time.sleep(3) 51 52 # 验证码识别 53 ocr = ddddocr.DdddOcr() 54 with open('captcha.jpg', 'rb') as f: 55 img_bytes = f.read() 56 res = ocr.classification(img_bytes) 57 return res 58 59 60 # 判断元素是否存在,不存在抛出异常捕获 61 def iselement(xpath): 62 try: 63 driver.find_element_by_xpath(xpath) 64 except NoSuchElementException: 65 return False