python使用winio解决有时候selenium的send_keys失效问题,实现键盘输入

本文主要是介绍python使用winio解决有时候selenium的send_keys失效问题,实现键盘输入,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

声明:本文旨在技术分享交流,任何利用本文提及的技术做违法犯罪活动行为均与本人无关,请各位观者不要用于违法的事情哦。严格遵守我国法律,做守法守纪的好公民~

相信大部分人在使用网页的时候,遇到过一些输入框用selenium的send_keys会无效吧~

于是我采用了Pykeyboard提供的办法来实现输入,代码如下:

keyboard = PyKeyboard()def send_key(char, upper=False):if upper:keyboard.press_key(keyboard.shift_l_key)keyboard.tap_key(char)keyboard.release_key(keyboard.shift_l_key)time.sleep(0.1)

然而尝试后发现还是无法输入,应该是调用PyKeyboard这个包时,并没有真正的用到底层的键盘驱动,导致被控件识别。那么有没有一种办法可以使非键盘输入不被控件识别到呢?——当然有啦,那就是使用winio。

一    安装winio相关的包及证书

1.安装winio

pip install rabird.winio

2.使电脑进入禁用驱动程序强制签名状态

下面以win10为例,介绍如何进入高级启动模式

(1)进入设置页面后,点击最后面的更新和安全:

(2)在恢复页签下点击立即重新启动,注意事先把该保存的保存了哈

(3)重启后的页面中点击疑难解答:

(4)在疑难解答中选择——》高级选项----》在高级选项中选择启动设置----》点击启动----》在启动页面中输入7,也就是我们要进入的模式中。

(5)重启后,进入python的安装目录(or你的venv环境目录——反正是你安装winio那个python版本的目录),进入..\Lib\site-packages\winiobinary\data\3.0找到WinIo64.sys这个文件。

(6)对该文件右键属性,进入属性中数字签名页面中,按照下面箭头所示操作,将该证书安装到“受信任的根证书”中。安装证书步骤可以网上找一找,这里不再赘述,如下图步骤所示:

二    模拟键盘输入

1.定位输入框

定位输入框可以采用selenium的click方法定位元素,将鼠标箭头置于了输入框中。

也可以采用PyMouse根据页面元素所在的(x,y)坐标来点击:

采用PyMouse的办法实现如下:

from pymouse import PyMouse
mouse = PyMouse()
mouse.click(x, y)    # x,y为要点击的位置在当前屏幕下的坐标

2.采用winio实现键盘输入功能

代码如下:

import rabird.winio
import time
import atexit# KeyBoard Commands
# Command port
KBC_KEY_CMD = 0x64
# Data port
KBC_KEY_DATA = 0x60__winio = Nonedef __get_winio():global __winioif __winio is None:__winio = rabird.winio.WinIO()def __clear_winio():global __winio__winio = Noneatexit.register(__clear_winio)return __winiodef wait_for_buffer_empty():'''Wait keyboard buffer empty'''winio = __get_winio()dwRegVal = 0x02while (dwRegVal & 0x02):dwRegVal = winio.get_port_byte(KBC_KEY_CMD)def key_down(scancode):winio = __get_winio()wait_for_buffer_empty()winio.set_port_byte(KBC_KEY_CMD, 0xd2)wait_for_buffer_empty()winio.set_port_byte(KBC_KEY_DATA, scancode)def key_up(scancode):winio = __get_winio()wait_for_buffer_empty()winio.set_port_byte(KBC_KEY_CMD, 0xd2)wait_for_buffer_empty()winio.set_port_byte(KBC_KEY_DATA, scancode | 0x80)def key_press(scancode, press_time=0.2):key_down(scancode)time.sleep(press_time)key_up(scancode)# Press 'A' key
# Scancodes references : https://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html
# key_press(0x1E)VK_CODE = {'1': 0x02,'2': 0x03,'3': 0x04,'4': 0x05,'5': 0x06,'6': 0x07,'7': 0x08,'8': 0x09,'9': 0x0A,'0': 0x0B,'a': 0x1E,'b': 0x30,'c': 0x2E,'d': 0x20,'e': 0x12,'f': 0x21,'g': 0x22,'h': 0x23,'i': 0x17,'j': 0x24,'k': 0x25,'l': 0x26,'m': 0x32,'n': 0x31,'o': 0x18,'p': 0x19,'q': 0x10,'r': 0x13,'s': 0x1F,'t': 0x14,'u': 0x16,'v': 0x2F,'w': 0x11,'x': 0x2D,'y': 0x15,'z': 0x2C,# 'backspace': 0x0E,# 'clear': 0x0C,# 'enter': 0x0D,# 'shift': 0x10,# 'ctrl': 0x11,# 'alt': 0x12,'caps_lock': 0x3A,'-': 0x0C,# '=': 0x0D,# '[': 0x1A,# ']': 0x1B,# '\\': 0x2B,# ';': 0x27,# "'": 0x28,# '`': 0x29,# ',':0x33,# '.': 0x34,# '/': 0x35,
}def key_input(str=''):for c in str:try:key_press(VK_CODE[c])except:key_press(0x3A)time.sleep(0.5)key_press(VK_CODE[c.lower()])key_press(0x3A)if __name__ == "__main__":str = '0123456789abcdefghijklmnopqrstuvwxyz'key_input(str)

 

这篇关于python使用winio解决有时候selenium的send_keys失效问题,实现键盘输入的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/875510

相关文章

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

Python操作PDF文档的主流库使用指南

《Python操作PDF文档的主流库使用指南》PDF因其跨平台、格式固定的特性成为文档交换的标准,然而,由于其复杂的内部结构,程序化操作PDF一直是个挑战,本文主要为大家整理了Python操作PD... 目录一、 基础操作1.PyPDF2 (及其继任者 pypdf)2.PyMuPDF / fitz3.Fre