我遇到了一个问题,即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事件只对修改键有意义。"
这里是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.回答。 经过一点修改 - 完美适合我。不得不添加切换到框架,并将事件调度到文档而不是我的案例的特定元素。
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);
答案 0 :(得分:2)
Selenium API不提供此功能。从官方文档:
https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol
服务器必须按如下方式处理密钥序列: 键盘上显示的每个键不需要修饰符,将作为键盘发送,然后键入。
但是你可以用一段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);
答案 1 :(得分:0)
如果您无法使用selenium找到答案,则可以使用其他工具(例如AutoIt或AutoHotKey)触发脚本,只需按住键即可。
屁股很痛,但这可能是你唯一的选择。