Search code examples
seleniumclickkeykeypress

How to keyPress + click with selenium


I have a problem with my Selenium code not performing correctly the keyPress + click operation.

The test should open the jqueryui.com link and select the first 2 li elements on the page.

I am using Selenium 2.23 and Firefox 10. My code is as follows (I have trie 4 different ways to get it working but none performed):

FirefoxProfile profile = new FirefoxProfile();

profile.setEnableNativeEvents(true); WebDriver browser = new FirefoxDriver(profile); browser.get("http://jqueryui.com/demos/selectable/");

List elements = browser.findElements(By.cssSelector("ol#selectable li"));

 Actions a = new Actions(browser);      
 a.keyDown(Keys.CONTROL)
 .moveToElement(elements.get(0))
 .click()
 .moveToElement(elements.get(1))
 .click()
 .keyUp(Keys.CONTROL)
 .build()
 .perform();

    Keyboard keyboard = ((HasInputDevices) browser).getKeyboard();
    keyboard.pressKey(Keys.CONTROL);
    List<WebElement> selectOptions = browser.findElements(By.cssSelector("ol#selectable li"));
    selectOptions.get(1).click();
    selectOptions.get(3).click();
    keyboard.releaseKey(Keys.CONTROL); 
    Actions builder = new Actions(browser);
    builder.keyDown(elements.get(0), Keys.CONTROL)
        .click(elements.get(0))
        .click(elements.get(1))
        .keyUp(Keys.CONTROL);
    Action selectMultiple = builder.build();
    selectMultiple.perform();

    Robot robot = new Robot();
    robot.delay(1000);
    robot.keyPress(KeyEvent.CTRL_MASK);
    elements.get(0).click();
    elements.get(1).click();
    robot.keyRelease(KeyEvent.CTRL_MASK);

    browser.quit();

Can anyone help me with some other suggestions?


Solution

  • I really have no idea why none of your attempts work (particularly the first one). The key constants are a mess.

    Anyway, I have been able to make this work (on Windows XP):

    Robot robot = new Robot();
    robot.keyPress(KeyEvent.VK_CONTROL);
    elements.get(0).click();
    elements.get(1).click();
    robot.keyRelease(KeyEvent.VK_CONTROL);