写代码是不可能会写代码的,只有每天抄抄别人的代码这样子才可以维持一下生活 ------ 博客首页

磁感线

阿巴阿巴阿巴
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Selenium自动登录验证码获取踩坑

Posted on 2022-10-12 11:42  磁感线  阅读(276)  评论(0编辑  收藏  举报

为了偷懒 用python写了个自动登录脚本
此处特别感谢Python第三方库带带弟弟OCR的验证码识别:

import ddddocr

确实好用,比百度云免费接口准确率高 省去了调接口的麻烦

在使用selenium登录过程中 原先启动的是choremedriver
但是坑爹的公司旧系统更加适配ie 谷歌登录会使得有部分控件加载慢 并且页面缩放和兼容性会有问题
本来也就凑合用了 后来去搞了iedriver 想加快执行速度 结果踩了个大坑

原先截取验证码的方法是selenium的screenshot

png = browser.find_element_by_xpath("//td[contains(@width,'160')]/img")  # img参数表示的就是图片标签 查找验证码元素
png.screenshot('login.png')    #元素截图

在找到元素后直接对其截图 非常高效

然后换到iedriver的时候,问题来了:

发生异常: WebDriverException
Message: Command not found: GET /session/1df5d0b4-6167-4700-91af-9f01a8b14a6a/element/ccbf1159-225c-4b1d-a6be-21ab663210e4/screenshot
  File "C:\Users\15311.000\Desktop\登录\登录.py", line 37, in <module>
    png.screenshot('login.png')    #元素截图

沃日! 莫非iedriver不支持这样截图
这不是嗝了

那能不能换个别的方法 比如直接取链接
img_url = element.get_attribute('src')

然后发现验证码是aspx,会随时更新
没法直接通过获取src的方式弄下来 不同情况请求的图都不一样

于是上网找方法又比如

png.save_screenshot('login.png')

一样不存在

'WebElement' object has no attribute 'save_screenshot'

还有就是模拟手工点击的方法,模拟在图片上点击鼠标右键、图片另存为、弹出保存窗口的方法
但是不知道兼容性问题还是干嘛 点开右键的位置有问题 并且没用

png = browser.find_element_by_xpath("//td[contains(@width,'160')]/img")  
action = ActionChains(browser).move_to_element(png)  # 移动到该元素
action.context_click(pic)  # 右键点击该元素
action.perform() # 执行
pyautogui.typewrite(['v']) # 敲击V进行保存
time.sleep(1)# 单击图片另存之后等1s敲回车
pyautogui.typewrite(['enter'])

总之搞了半天
最后终于找到方法 就是自己切图:
找到对应元素的位置 然后用pyautogui库进行截图 然后切掉剩余部分

print(png.location)                # 打印元素坐标
print(png.size)                    # 打印元素大小
left = png.location['x']
top = png.location['y']+165 #165是浏览器的菜单栏高度
right = left + png.size['width']  
bottom = top + png.size['height']  
im = Image.open('login.png')
im = pyautogui.screenshot()
im1 = im.crop((left, top, right, bottom))
im.save('login.png')
im1.save('login.png')

终于得到和原来一样的验证码