Selenium sendKeys()针对Chrome,Firefox和Safari的不同行为

下面是简单的代码片段。

@FindBy(className = "element-to-press") private WebElement elementToPress; // some other code Keys move = Keys.ARROW_DOWN; gridContainer.sendKeys(move); 

Firefox中一切正常。

Chrome中我得到了"org.openqa.selenium.WebDriverException: unknown error: cannot focus element"错误

Safari对sendKeys()没有反应

我也试过用另一种方法:

 Keys move = Keys.ARROW_DOWN; Actions actions = new Actions(driver); actions.moveToElement(element).click(); // to focus on element actions.sendKeys(move).perform(); 

此代码修复了Chrome "cannot focus element"错误,但浏览器仍未对Keys.ARROW_DOWN/Keys.ARROW_UP/Keys.ARROW_LEFT/Keys.ARROW_RIGHT事件作出反应

Safari和Firefox也不会对sendKeys()做出反应。

我无法理解发生了什么,以及如何让我的代码运行所有这些浏览器。

环境

  • OS X 10.9.5

  • 最新版本的Chrome / Safari / Firefox

  • Selenium版本2.44.0

UPD:

将Selenium更新到2.46版。

适用于Chrome和Firefox。

但仍然存在Safari问题: org.openqa.selenium.remote.UnreachableBrowserException: Could not start a new session.

UPD2:

我安装了Safari浏览器扩展程序。 在此处输入图像描述

正如聊天中所讨论的那样,您希望自动化2048

作为一种解决方法,我基于此编写了Javascript来发送Arrow KeyEvents.And它适用于所有浏览器

你要做的就是发送箭头键,根本不需要点击元素[并找到元素,除非你根据值创建一个算法来播放)

你让我进入了这个。以下将为3个浏览器玩200(50 x 4)个不同动作的游戏

 import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.safari.SafariDriver; public class Main { public static void main(String args[]) { play(new FirefoxDriver()); play(new SafariDriver()); System.setProperty("webdriver.chrome.driver", "/Users/Apple/Documents/chromedriver"); play(new ChromeDriver()); } public static void play(WebDriver driver) { driver.get("http://gabrielecirulli.github.io/2048"); driver.findElement(By.className("restart-button")).click(); String script = "fireKey(arguments[0]);\n" + "function fireKey(arrow)\n" + "{\n" + " var key;\n" + " switch (arrow.toLowerCase())\n" + " {\n" + " case \"left\":\n" + " key = 37;\n" + " break;\n" + " case \"right\":\n" + " key = 39;\n" + " break;\n" + " case \"up\":\n" + " key = 38;\n" + " break;\n" + " case \"down\":\n" + " key = 40;\n" + " break;\n" + " }\n" + " if (document.createEventObject)\n" + " {\n" + " var eventObj = document.createEventObject();\n" + " eventObj.keyCode = key;\n" + " document.documentElement.fireEvent(\"onkeydown\", eventObj);\n" + " } else if (document.createEvent)\n" + " {\n" + " var eventObj = document.createEvent(\"Events\");\n" + " eventObj.initEvent(\"keydown\", true, true);\n" + " eventObj.which = key;\n" + " document.documentElement.dispatchEvent(eventObj);\n" + " }\n" + "} "; JavascriptExecutor js = (JavascriptExecutor) driver; //use left,right,up,down for arrow keys for (int i = 0; i < 50; i++) { js.executeScript(script, "left"); js.executeScript(script, "right"); js.executeScript(script, "up"); js.executeScript(script, "down"); } System.out.println("Score :" + driver.findElement(By.className("score-container")).getText()); driver.quit(); } } 

更新2

请参阅上面的答案以获取完整代码


更新1

SafariDriver Extension不能与Selenium 2.46一起使用。我已经尝试过,你必须将Selenium降级到2.45 ,因为2.46的SafariDriver Extension尚未发布。请参阅此GitHub问题

到目前为止,请使用Selenium 2.45


初步答复

您必须手动安装SafariDriver Extension

根据SafariWiki

从Selenium 2.45.0开始,您必须手动安装SafariDriver浏览器扩展。 只需在Safari中打开SafariDriver.safariextz的最新副本,然后单击“安装”按钮。 安装完成后,为Safari编写测试就像使用FirefoxDriver一样简单