如何用Selenium Python实现可应对银行随机虚拟键盘的登录Bot
完全可以实现,以下是3种不同复杂度的落地路径,你可以根据目标网站的实际实现逻辑选择:
OCR识别+坐标点击方案
先通过Selenium定位到虚拟键盘对应的DOM节点,调用element.screenshot()方法单独截取键盘区域的截图,对截图做简单的二值化、去噪预处理后,调用本地OCR工具(比如Tesseract、PaddleOCR)识别每个字符对应的像素坐标,再通过ActionChains类点击对应坐标即可完成输入。这个方案通用性最强,不管按键是用文本还是背景图渲染都适用,标准印刷字体的识别准确率基本可以达到100%。DOM特征匹配定位方案
大部分虚拟键盘的按键即使没有设置id,也会把字符存在innerText属性里,你可以直接用XPath文本匹配规则定位对应按键,示例XPath规则://div[contains(@class,"key-item") and text()="X"],直接替换目标字符就能定位到对应按键。如果按键是用背景图渲染字符的,你可以提前爬取所有字符对应的按键背景图,计算每张图的哈希值存为字符-哈希映射表,运行时批量获取所有按键的背景图计算哈希后匹配对应字符即可定位。JS直接注入绕过方案
所有虚拟键盘的点击逻辑最终都是将字符写入密码输入框的value属性,或者写入关联的隐藏表单域,你可以完全跳过虚拟键盘的交互逻辑,直接用Selenium执行JS脚本修改输入框值:const pwdInput = document.querySelector('input[type="password"]'); pwdInput.value = "你的密码"; // 触发输入事件绕过前端校验 pwdInput.dispatchEvent(new Event('input')); pwdInput.dispatchEvent(new Event('change'));这个方案实现成本最低,只要没有额外的前端加密逻辑都可以生效。
补充提示:部分银行站点会检测Selenium的自动化特征,你需要提前配置反检测参数,比如移除
navigator.webdriver特征、替换常规用户代理、禁用自动化标记的开关,避免被站点的反爬策略拦截。
内容的提问来源于stack exchange,提问作者Wassim Maestro

