selenium登录网银,密码控件输入
尝试登录农行网银,发现带控件的密码输入框怎么都无法输入啊
最后用虚拟键盘实现的 , DD模拟键盘 http://www.ddxoft.com/
图形验证码识别没过,有时间再继续
需要安装 Tesseract-OCR IEdriver ,dd下载dll
# _*_ coding: utf-8 _*_
import os, sys
import uuid, time
import pytesseract
from selenium import webdriver
from ctypes import windll
from PIL import Image def tesseract_file(file_path):
#my_env = {'TESSDATA_PREFIX': r'C:\Program Files\Tesseract-OCR\testdata'}
image = Image.open(os.path.realpath(file_path))
result = pytesseract.image_to_string(image)
return result def login_abc(param):
url = 'https://perbank.abchina.com/EbankSite/startup.do'
ie_driver = 'C:\Program Files\Internet Explorer\IEDriverServer.exe'
#os.environ["webdriver.ie.driver"] = ie_driver
browser = webdriver.Ie(ie_driver)
browser.maximize_window()
browser.get(url)
time.sleep(1) browser.find_element_by_id('username').send_keys(param['username']) #载入DD
libpath = 'libs/DD81200x32.dll' if sys.platform == 'win32' else 'libs/DD81200x64.32.dll'
dd_dll = windll.LoadLibrary(libpath) vk = {'': 205, 'c': 503, 'n': 506, 'z': 501, '': 203, '': 201, 'd': 403, '': 210, 'l': 409, '': 208,
'w': 302,
'u': 307, '': 204, 'e': 303, '[': 311, 'f': 404, 'y': 306, 'x': 502, 'g': 405, 'v': 504, 'r': 304,
'i': 308,
'a': 401, 'm': 507, 'h': 406, '.': 509, ',': 508, ']': 312, '/': 510, '': 206, '': 202, 'b': 505,
'k': 408,
'': 207, 'q': 301, "'": 411, '\\': 313, 'j': 407, '`': 200, '': 209, 'p': 310, 'o': 309, 't': 305,
'-': 211,
'=': 212, 's': 402, ';': 410}
#需要组合shift的按键。
vk2 = {'"': "'", '#': '', ')': '', '^': '', '?': '/', '>': '.', '<': ',', '+': '=', '*': '', '&': '',
'{': '[', '_': '-',
'|': '\\', '~': '`', ':': ';', '$': '', '}': ']', '%': '', '@': '', '!': '', '(': ''} def down_up(code):
dd_dll.DD_key(vk[code], 1)
dd_dll.DD_key(vk[code], 2) def dd(key):
if i.isupper():
# 按下抬起 500是shift键码
dd_dll.DD_key(500, 1)
down_up(i.lower())
dd_dll.DD_key(500, 2) elif i in '~!@#$%^&*()_+{}|:"<>?':
dd_dll.DD_key(500, 1)
down_up(vk2[i])
dd_dll.DD_key(500, 2)
else:
down_up(i) img = browser.find_element_by_id('vCode')
x, y = img.location['x'] + 50, img.location['y'] + 50 #移动到密码框点击激活
dd_dll.DD_mov(x, y)
dd_dll.DD_btn(1)
time.sleep(1) #依次输入密码字符
for i in param['password']:
dd(i)
time.sleep(0.2) left, top = img.location['x'], img.location['y']
width, height = img.size['width'] + left, img.size['height'] + top
os.makedirs('imgs')
oldpath = 'imgs/' + str(uuid.uuid1()) + '.png'
browser.save_screenshot(oldpath)
oldpic = Image.open(oldpath)
newpic = oldpic.crop((left, top, width, height))
picpath = 'imgs/' + str(uuid.uuid1()) + '.png'
newpic.save(picpath)
os.remove(oldpath) #tesseract可以识别简单的图形验证码
vcode = tesseract_file(picpath)
browser.find_element_by_name('code').send_keys(vcode) #os.remove(picpath)
browser.find_element_by_id('logo').click() time.sleep(1)
logerr = browser.find_element_by_class_name('logon-error').text
print(logerr) if __name__ == '__main__':
login_abc({'username':'', 'password':''})
selenium登录网银,密码控件输入的更多相关文章
- 使用WinIo32绕过密码控件实现自动登录
通过winIO32绕过密码控件,实现自动登录 环境: vmware上安装windows 32位系统:windows xp / windows 7 selenium版本: 3.11.0 IEDriver ...
- H5端密码控件自动化测试
最近在做H5端UI自动化测试,其中遇到了一个棘手问题就是密码控件,因为密码控件的按钮每次都是随机不一样的,没法固定去点击输入密码.密码的输入框是div不是input,所以没法用send_keys()这 ...
- PassGuard密码控件配置
运行环境 win服务器 系统server2008R2 C# ASP.NET服务器页面 前端部分 1.引用 //JS部分引用 <script type="text/javasc ...
- 《手把手教你》系列技巧篇(三十七)-java+ selenium自动化测试-日历时间控件-上篇(详解教程)
1.简介 我们在实际工作中,有可能遇到有些web产品,网页上有一些时间选择,然后支持按照不同时间段范围去筛选数据.网页上日历控件一般,是一个文本输入框,鼠标点击,就会弹出日历界面,可以选择具体日期.这 ...
- 《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)
1.简介 理想很丰满现实很骨感,在应用selenium实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这样的操作就 ...
- Selenium自动化测试之基本控件使用
Selenium自动化测试之基本控件使用 1.输入框input: 在Html中样式: <input id="username" type="text"&g ...
- EditorGUI控件输入监听
EditorGUI控件输入监听 在做编辑器开放的过程中,有时候要对用户输入进行判断和限制,但EditorGUI控件却没有触发回调,而是提供了一种麻烦的办法--使用EditorGUI.BeginChan ...
- Selenium webdriver 操作日历控件
一般的日期控件都是input标签下弹出来的,如果使用webdriver 去设置日期, 1. 定位到该input 2. 使用sendKeys 方法 比如: 但是,有的日期控件是readonly的 比如1 ...
- Selenium webdriver 之select 控件封装,解决onchange问题
使用webdriver的时候,select 控件经常会绑定onchange 事件,在selenium2.09 之前click 方法对onchange 事件有bug,2.09 以后修复了,但是根据经验也 ...
随机推荐
- OI常用模板
long long qpow(long long a,long long b,int mod) { ; while (b) { ) res=res*a%mod; a=a*a%mod; b>> ...
- java基础——深拷贝和浅拷贝的区别
浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝. 深拷贝:对基本数据类型进行值传递,对引用数据类型船舰一个新的对象,并复制内容,这是深拷贝.
- [tensorflow] 线性回归模型实现
在这一篇博客中大概讲一下用tensorflow如何实现一个简单的线性回归模型,其中就可能涉及到一些tensorflow的基本概念和操作,然后因为我只是入门了点tensorflow,所以我只能对部分代码 ...
- Linux下mysql5.7安装
当前最新版本为5.7,此次将分别采用yum安装和tar包编译安装的方式分别说明. 一.Yum安装 A:获取repo源 [root@localhost ~]# wget http://dev.mysql ...
- 【每日Scrum】第五天冲刺
一.计划会议内容 仍然在解决数据库问题 二.任务看板 三.scrum讨论照片 四.产品的状态 无 五.任务燃尽图
- Mycat简介及适用场景
官网:http://www.mycat.io/ 一.Mycat是什么 Mycat是一个开源的分布式数据库系统,是一个实现了 MySQL 协议的的 Server,前端用户可以把它看作是一个数据库代理,用 ...
- ftp主动和被动模式区别
转载自:http://www.west999.com/cms/wiki/server/2018-11-16/49417.html FTP是基于TCP的服务的,FTP不同之处在于FTP使用两个端口,一个 ...
- Redis的数据结构和对象。
一.简单动态字符串(simple dynamic string--SDS) Redis使用SDS表示字符串值,键值对都用SDS实现.SDS中的字符数组buf以空字符串结尾,好处是可以直接重用一部分C字 ...
- 关于scala工程结构(使用sbt)
scala_project:常用目录结构: |lib:手动添加依赖包 |project | |build.properties:build的版本号,可以不写,会自动下载 | |plugins.sbt: ...
- C++用libcurl通过HTTP以表单的方式Post数据到服务器
POST字符串 #include <stdio.h> #include <curl/curl.h> int main(void) { CURL* curl = NULL; CU ...