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

时间:2015-07-21 18:59:57

标签: java selenium selenium-webdriver

以下是简单的代码片段。

@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 v​​ersion 2.44.0

UPD:

将Selenium更新为2.46版。

适用于Chrome和Firefox。

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

UPD2:

我安装了Safari浏览器扩展程序。 enter image description here

2 个答案:

答案 0 :(得分:2)

更新2

请参阅above答案以获取完整代码

更新1

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

到目前为止,请使用Selenium 2.45

<小时/> 初步答案

您必须手动安装SafariDriver Extension

根据SafariWiki

  

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

答案 1 :(得分:1)

如聊天中所述,您希望自动2048

作为一种解决方法,我写了Javascript based on this来发送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();
}
}