4

我遇到了一個問題,即硒不能按住鍵,是不是在這個名單 -如何使用硒按住非修飾鍵(空格鍵)?

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

我的應用表明,只有當按下空格鍵不放說明。我想爲此編寫瀏覽器測試。

我正在使用ProtractorJS,但它似乎像這樣的行動的一般限制,無論在任何地方,當你嘗試使用其他鍵的keyDown - 你會得到一個異常,像這樣的消息 - 「鍵向下/感覺修飾鍵。「

這裏是鏈接硒Java代碼: https://github.com/SeleniumHQ/selenium/blob/master/java/client/src/org/openqa/selenium/interactions/internal/SingleKeyAction.java#L48

而且相同的檢查中硒的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

有趣 - 我的閱讀該規範(https://w3c.github.io/webdriver/webdriver-spec.html #keyboard-actions)似乎沒有強烈地證明當前的行爲。 –

回答

2

Selenium API不提供此功能。從官方文檔:

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

如下服務器必須處理的按鍵順序: 的鍵盤上顯示,而無需修飾每個按鍵都爲的keydown,然後一鍵發送了。

但是你可以用一段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); 
0

如果你不能使用硒找到一個答案,你可能會引發與其他工具(如AutoItAutoHotKey)只是做了按鍵不放的腳本。

這是一個痛苦的屁股,但它可能是你唯一的選擇。