xebia / Xebium

Xebium provides Selenium (webdriver) bindings for FitNesse, with Selenium-IDE support
http://xebia.github.com/Xebium/
Apache License 2.0
76 stars 62 forks source link

sendKeys not working for key strokes (special keys) #125

Open ghost opened 10 years ago

ghost commented 10 years ago

Hi,

I have been trying to send KEY_BACKSPACE using xebium and am running into some issues with that:

The code given by selenium IDE is :

sendKeys //input[@id=blahblah'] ${KEY_BACKSPACE}

which works.

The code given by the xebium formatter is:

| do | sendKeys | on | !-//input[@id='blahblah']-! | with | $KEY_BACKSPACE |

which doesn't seem to be working. I also tried entering $KEY_BACKSPACE between !- -! to avoid formatting by fitnesse and that didn't help either.

p.s. Using firefox driver

Thanks!

sglebs commented 10 years ago

I am having the exact same problem, with TAB. I have tried:

\t \t !- ${KEY_BACKSPACE} -! !- $KEY_BACKSPACE -!

None of these worked

sglebs commented 10 years ago

One of the problems I see is in class com.xebia.incubator.xebium.fastseleniumemulation.Type. It is missing a bunch (like tab, backspace etc):

@Override
protected Void handleSeleneseCommand(WebDriver driver, String locator, String value) {
    alertOverride.replaceAlertMethod(driver);

    if (value == null) {
        value = "";
    }
    value = value.replace("\\10", Keys.ENTER);
    value = value.replace("\\13", Keys.RETURN);
    value = value.replace("\\27", Keys.ESCAPE);
    value = value.replace("\\38", Keys.ARROW_UP);
    value = value.replace("\\40", Keys.ARROW_DOWN);
    value = value.replace("\\37", Keys.ARROW_LEFT);
    value = value.replace("\\39", Keys.ARROW_RIGHT);
jguglielmi commented 10 years ago

Consider maybe adding a pull request for an enum?

sglebs commented 10 years ago

I patched the code above to support TAB and it works:

@Override
protected Void handleSeleneseCommand(WebDriver driver, String locator, String value) {
    alertOverride.replaceAlertMethod(driver);

    if (value == null) {
        value = "";
    }
    value = value.replace("\\08", Keys.TAB);   // mqm
    value = value.replace("\\10", Keys.ENTER);
    value = value.replace("\\13", Keys.RETURN);
    value = value.replace("\\27", Keys.ESCAPE);
    value = value.replace("\\38", Keys.ARROW_UP);
    value = value.replace("\\40", Keys.ARROW_DOWN);
    value = value.replace("\\37", Keys.ARROW_LEFT);
    value = value.replace("\\39", Keys.ARROW_RIGHT);

    WebElement element = finder.findElement(driver, locator);

    clear(element);
    element.sendKeys(value);
    triggerEvents(element, driver);

    return null;
}

In your cell, use \08 and it will send a TAB. You must do the same for Backspace and all the other missing special characters.

sglebs commented 10 years ago

The 08 above is preceded by 2 backslashes in the table cell. Somehow one slash was eaten by the formatting here. Just one backslash will not work.

sglebs commented 9 years ago

In the fork I made, I solved this in a slightly different way now. I populate the special keys in the alias map. So now I have to precede its symbolic name with % in any table cell. In other words: %$KEY_TAB instead of $KEY_TAB when you use sendKeys.

The fix was simple: add a method, initSpecialKeysMapping, and make the constructor call it. Here:

public SeleniumDriverFixture() {
    super();
            initSpecialKeysMapping();
}

private void initSpecialKeysMapping() {
    aliases.put("$KEY_BACKSPACE", Keys.chord(Keys.BACK_SPACE));
    aliases.put("$KEY_TAB", Keys.chord(Keys.TAB));
    aliases.put("$KEY_ENTER", Keys.chord(Keys.ENTER));
    aliases.put("$KEY_RETURN", Keys.chord(Keys.RETURN));
}

Anyway, this is available in my fork.