Javascript 在Python Selenium中检测用户键/鼠标
我正在使用Selenium浏览器进行日常浏览,当我在任何页面上按一些键时,我想触发一些代码。起初,我认为我可以在每个注册键/鼠标输入的页面上加载javascript,但实际上我更喜欢在过去的键/鼠标单击中提供一些python列表,例如,我的javascript键示例:Javascript 在Python Selenium中检测用户键/鼠标,javascript,python,selenium,Javascript,Python,Selenium,我正在使用Selenium浏览器进行日常浏览,当我在任何页面上按一些键时,我想触发一些代码。起初,我认为我可以在每个注册键/鼠标输入的页面上加载javascript,但实际上我更喜欢在过去的键/鼠标单击中提供一些python列表,例如,我的javascript键示例: var myhistory = [] document.addEventListener("keydown", keyDownTextField, false); function keyDownTextField(e) {
var myhistory = []
document.addEventListener("keydown", keyDownTextField, false);
function keyDownTextField(e) {
var keyCode = e.keyCode;
myhistory.push(keyCode)
}
在纯Python/Selenium中有什么方法可以做到这一点吗?我将尝试:
<body onkeyup="my_javasctipt_keyup()" and onkeydown="my_javasctipt_keydown()">
问题是,selenium的代码永远不能在浏览器处理键盘输入的同时运行。因此,事件需要用javascript处理,结果保存在一个数组中,然后,当selenium被请求时,数组返回Python。好吧,在这种情况下,您必须为这项工作选择正确的工具,我建议web自动化系列工具使用纯JS,它可以轻松地与浏览器交互(从JS到JS)并直接从另一方捕获事件,而无需任何调解 然而,使用selenium,您仍然可以通过传递的方式实现这一点,而不会对页面的代码造成太多的混乱,也不会因不必要的任务而对其收费过高,同时重新加载页面内容会重置其所有变量,这意味着这是一种有损的方法。最好的方法是在内部设置eventhandler,并使用
运行时直接从外部捕获它。相反,请评估,因为它不会影响页面内容,特别是在使用promise调用生成某些内容之前,它会一直坚持函数,它比反复探索某个全局变量要好得多,因为它被视为一种糟糕的做法
为了避免锁定cpu,需要并行分叉线程
from threading import Timer
t = Timer(0.0, waitforclick)
然后t.start()
而不是waitforclick()
如果您想在一段时间后以零值拒绝承诺,也可以使用timeout
。boppreh/keyboard
允许您这样做。
你可以安装它<代码>pip安装键盘
你进口它<代码>导入键盘
你用它<代码>键盘。添加热键('left',print,args=['您按了左箭头键])
然后禁用它<代码>键盘。删除所有热键()我是否正确理解你的问题:你坐在电脑前使用键盘,selenium控制屏幕上的浏览器,你想知道你在浏览器窗口中按了哪些键,只使用Python,没有javascript代码?@用户实际上,javascript是允许的。主要的一点是我的python会话应该能够接收信息。有什么解决方案吗?@PascalVKooten让我知道这是否有效you@Revaapriyan我加了一个新的答案。它不起作用了。这两个语句在代码中都不返回任何值,但在chrome控制台中工作正常
driver=webdriver.Chrome()
driver.get(“chrome://dino/”
script=“window.onkeydown=function(e){return e.which;}“
为True:
打印(驱动程序执行脚本,end=“…”)
此打印无。。没有一个没有一个无..
…我希望您的代码不会打印任何内容。我修改了上面的代码并添加了最后4行。你怎么认为?问题是,selenium的代码永远不能在浏览器处理键盘输入的同时运行。因此,事件需要在javascript中处理,结果保存,例如在数组中,然后当请求selenium时,数组返回python。def get\u history(driver):
返回driver.execute\u script(“myhistory”)
driver=webdriver.Chrome()
driver.get(“chrome://dino/")
驱动程序。执行脚本(“'var myhistory=[]
文档。addEventListener(“keydown”,keyDownTextField,false);
函数keyDownTextField(e){
`myhistory.push(keyCode)`)`time.sleep(5)为True时:
驱动程序。通过标记名称(“正文”)查找元素。发送键(键。箭头向上)
打印(获取历史记录(驱动程序))
但这会导致错误:WebDriverException:消息:未知错误:“myhistory”未定义Chrome版本=71.0.3578.98(正式版本)(64位)
myhistory = []
evt_handler = """
new Promise((rs,rj) => window.onkeydown= e => rs(e.keyCode) )
"""
def waitforclick():
try:
myhistory.append(browser.execute_cdp_cmd('Runtime.evaluate', {'expression': evt_handler, 'awaitPromise': True,'returnByValue': True})['result']['value'])
except:
waitforclick()
from threading import Timer
t = Timer(0.0, waitforclick)