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

Pas*_*ten 5 javascript python selenium

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

var myhistory = []

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

function keyDownTextField(e) {
var keyCode = e.keyCode;
  myhistory.push(keyCode)
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在纯 Python/Selenium 中做到这一点?

Use*_*ser 3

我会尝试什么:

  1. 执行在文档正文中注册的 javascript

    <body onkeyup="my_javasctipt_keyup()" and onkeydown="my_javasctipt_keydown()"> 
    
    Run Code Online (Sandbox Code Playgroud)

    使用browser.execute_script。(部分解决,参见问题)

  2. 将 key up 和 keydown 事件保存在 javascript 的变量中。(已解决,请参阅问题)

  3. 用于browser.execute_script返回变量。

我不确定的是:

  • 返回值browser.execute_script可能仅返回json可序列化对象或字符串
  • 如果在定义自己的事件侦听器的子元素中使用它们,则 body 中的 keyup 和 keydown 可能不起作用

希望这有帮助。如果有任何代码结果,我有兴趣知道。

我觉得这段代码应该有效:

from selenium import webdriver
browser = webdriver.Firefox()
browser.execute_script("""var myhistory = []

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

function keyDownTextField(e) {
var keyCode = e.keyCode;
  myhistory.push(keyCode)
}""")
def get_history():
    return browser.execute_script("myhistory")

# now wait for a while and type on the browser
import time; time.sleep(5000)

print("keys:", get_history())
Run Code Online (Sandbox Code Playgroud)

关键是,selenium 的代码永远不能在浏览器处理键盘输入的同时运行。因此,需要在 javascript 中处理事件,将结果保存在数组中,然后,当请求 selenium 时,将数组返回给 Python。