Selenium sendKeys()对于Chrome,Firefox和Safari的不同行为 [英] Selenium sendKeys() different behaviour for Chrome, Firefox and Safari

查看:81
本文介绍了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()没有反应

Safari does not react for sendKeys()

我也尝试使用另一种方法:

Also I've tried to use another approach:

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事件

This code fixed Chrome "cannot focus element" error, but browser still does not react for Keys.ARROW_DOWN/Keys.ARROW_UP/Keys.ARROW_LEFT/Keys.ARROW_RIGHT events

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

Safari and Firefox do not react for sendKeys() as well.

我不知道发生了什么以及如何使我的代码在所有这些浏览器上运行.

I cannot understand what is going on and how I can make my code run for all this browsers.

环境:

  • OS X 10.9.5

  • OS X 10.9.5

Chrome/Safari/Firefox的最新版本

Latest version of Chrome/Safari/Firefox

硒版本2.44.0

UPD:

将Selenium更新到版本2.46.

Update Selenium to version 2.46.

现在可用于Chrome和Firefox.

Works for Chrome and Firefox now.

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

But still have an issue with Safari:org.openqa.selenium.remote.UnreachableBrowserException: Could not start a new session.

UPD2:

UPD2:

我已安装Safari浏览器扩展程序.

I have Safari browser extension installed.

推荐答案

如聊天中所讨论的,您希望自动 2048

As discussed in chat you want to automate 2048

作为一种解决方法,我编写了基于此的Java 来发送Arrow KeyEvent.而且它在所有浏览器中都有效

As a workaround I've written Javascript based on this to send Arrow KeyEvents.And It worked on all browsers

您要做的就是发送箭头键,根本不需要单击元素[和查找元素,除非您创建一个基于值播放的算法]

All you want to do is send arrow keys no need to click element at all [and find element ,unless you create a algorithm to play based on values)

您已经了解了我的内容.以下将针对3个浏览器玩200(50 x 4)种不同动作的游戏

You got me into this.The following will play game with 200(50 x 4) different moves for 3 browsers

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();
}
}

这篇关于Selenium sendKeys()对于Chrome,Firefox和Safari的不同行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆