为了偷懒 用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')
终于得到和原来一样的验证码