Javascript 在Python Selenium中检测用户键/鼠标

Javascript 在Python Selenium中检测用户键/鼠标,javascript,python,selenium,Javascript,Python,Selenium,我正在使用Selenium浏览器进行日常浏览,当我在任何页面上按一些键时,我想触发一些代码。起初,我认为我可以在每个注册键/鼠标输入的页面上加载javascript,但实际上我更喜欢在过去的键/鼠标单击中提供一些python列表,例如,我的javascript键示例: var myhistory = [] document.addEventListener("keydown", keyDownTextField, false); function keyDownTextField(e) {

我正在使用Selenium浏览器进行日常浏览,当我在任何页面上按一些键时,我想触发一些代码。起初,我认为我可以在每个注册键/鼠标输入的页面上加载javascript,但实际上我更喜欢在过去的键/鼠标单击中提供一些python列表,例如,我的javascript键示例:

var myhistory = []

document.addEventListener("keydown", keyDownTextField, false);

function keyDownTextField(e) {
var keyCode = e.keyCode;
  myhistory.push(keyCode)
}
在纯Python/Selenium中有什么方法可以做到这一点吗?

我将尝试:

  • 执行在文档体中注册的javascript

    <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)