javascript - 如何使用 Selenium 按住非修改键(空格键)?

标签 javascript selenium selenium-webdriver webdriver protractor

我遇到了一个问题,selenium 无法按住不在此列表中的键 -

Keys.SHIFT, 
Keys.CONTROL, 
Keys.ALT, 
Keys.META,
Keys.COMMAND, 
Keys.LEFT_ALT, 
Keys.LEFT_CONTROL,
Keys.LEFT_SHIFT

我的应用程序仅在按住空格键时显示说明。我想为此编写浏览器测试。

我正在使用 ProtractorJS,但它似乎是对此类操作的一般限制,当您尝试将 keyDown 用作其他键时,selenium 中的任何地方 - 您将收到一个异常消息,如这样 - “Key Down/Up events only make sense修饰键。”

这里是 Selenium Java 代码的链接: https://github.com/SeleniumHQ/selenium/blob/master/java/client/src/org/openqa/selenium/interactions/internal/SingleKeyAction.java#L48

同样检查 selenium js 代码: https://github.com/SeleniumHQ/selenium/blob/master/javascript/webdriver/actionsequence.js#L301

如何按住非修改键?在我的例子中是空格键。

更新: 感谢 Florent B. 的回答。 稍作修改后 - 对我来说非常适合。必须将切换添加到框架,并将事件分派(dispatch)到文档而不是我的案例的特定元素。

browser.switchTo().frame('workspace');  
const SIMULATE_KEY =  
"var e = new Event('keydown');" +  
"e.keyCode = 32;" +  //spacebar keycode
"e.which = e.keyCode;" +  
"e.altKey = false;" +  
"e.ctrlKey = false;" +  
"e.shiftKey = false;" +  
"e.metaKey = false;" +  
"e.bubbles = true;" +  
"document.dispatchEvent(e);";  
browser.executeScript(SIMULATE_KEY);

最佳答案

Selenium API 不提供此功能。来自官方文档:

https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol

The server must process the key sequence as follows: Each key that appears on the keyboard without requiring modifiers are sent as a keydown followed by a key up.

但是您可以使用一段 Javascript 模拟按键事件:

const SIMULATE_KEY =
  "var e = new Event(arguments[0]);" +
  "e.key = arguments[1];" +
  "e.keyCode = e.key.charCodeAt(0);" +
  "e.which = e.keyCode;" +
  "e.altKey = false;" +
  "e.ctrlKey = false;" +
  "e.shiftKey = false;" +
  "e.metaKey = false;" +
  "e.bubbles = true;" +
  "arguments[2].dispatchEvent(e);";

var target = driver.findElement(By.Id("..."));

// press the key "a"
browser.executeScript(SIMULATE_KEY, "keydown", "a", target);

// release the key "a"
browser.executeScript(SIMULATE_KEY, "keyup", "a", target);

关于javascript - 如何使用 Selenium 按住非修改键(空格键)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36266151/

相关文章:

javascript - 为什么三元运算符中不能有 return ?

java - 使用 Selenium WebDriver 在元素内查找时结果太多

python - pytest 自动化显然在测试收集阶段运行测试

java - Selenium - 单击不会触发任何操作也不会引发异常

java - 知道如何将 Selenium WebDriver 日志发送到 Kibana

javascript - 如何覆盖文本框段落中的特定文本值

javascript - 从jquery添加的html控件触发asp.net事件

javascript - 将导航与 Logo 对齐

javascript - 在顶部和底部 div 下滚动溢出

selenium - 如何在 Safari (MAC) 的 webdriver 中上传文件