如何在 Selenium 中按 Shift + Ctrl + s

hea*_*rdm 5 selenium selenium-webdriver

如何在 Selenium 中按 Shift + Ctrl + s ?我使用了下面的代码:

Actions action = new Actions(driver);   
action.sendKeys(Keys.chord(Keys.SHIFT + Keys.CONTROL + "s")).perform();
Run Code Online (Sandbox Code Playgroud)

它的投掷错误

kro*_*lko 3

如果您只是发送一系列按键,则每个按键代码的 Webdriver 首先按下给定的按键,然后按下它。
所以你的代码sendKeys(Keys.chord(Keys.SHIFT + Keys.CONTROL + "s")相当于下面一系列事件发生的时间:

  1. 按 SHIFT 键
  2. 按下 SHIFT 键
  3. 按控制键
  4. 按下控制键
  5. 按 s
  6. 按下 s

这不是您想要的,因为您期望 Ctrl 和 Shift 已被按下,并且在按下 S 键时被按住。


您需要使用Actions#keyDown方法按下该键并将其保持按下状态,然后使用Actions#keyUp释放该键。因此,操作顺序可能是:

  1. 按 SHIFT - 使用keyDown
  2. 按 Ctrl - 使用keyDown
  3. 按下然后松开S(该键可以使用按下后立即松开的sendKeys方法)
  4. 等待按 Ctrl-Shift-S 的可见效果
  5. 释放 Ctrl - 使用keyUp
  6. 释放 Shift - 使用keyUp

必须完成第 5 点和第 6 点(释放按键),以避免稍后在测试代码中出现意外影响(不要将 Ctrl+Shift 保持在按下状态)。


这是jsfiddle 上简单页面的链接,它可以帮助我们测试 WebDriver 代码。

<body>

<p>Press a key on the keyboard in the input field to find out if the Ctrl-SHIFT key was pressed or not.</p>

<input id="ctrl_shift_s" type="text" onkeydown="isKeyPressed(event)">

<p id="demo"></p>

<script>
function isKeyPressed(event) {
    console.log( event.keyCode);
    var x = document.getElementById("demo");
    if (event.shiftKey && event.ctrlKey && event.keyCode == 83 ) {
        x.innerHTML = "The Ctrl-SHIFT-S keys were pressed!";
    } else {
        x.innerHTML = "Please press Ctrl-SHIFT-S";
    }
}
</script>

</body>
Run Code Online (Sandbox Code Playgroud)

如果将光标移至此页面上的 INPUT 字段(该元素的 id="ctrl_shift_s"),然后按 Ctrl-SHIFT-S 键(按住 SHIFT 和 Ctrl),则会出现一条消息。Ctrl-SHIFT-S 键被压了! 在此输入图像描述


下面是使用最新的 IE、Firefox 和 Chrome 驱动程序根据上述测试页进行测试的示例(工作)代码。您必须使用requireWindowFocus();选项才能Actions在 IE 驱动程序中运行。

WebDriver driver= null;
try{

    System.setProperty("webdriver.ie.driver", "C:\\instalki\\IEDriverServer.exe");
    System.setProperty("webdriver.chrome.driver", "C:\\instalki\\chromedriver.exe");
    System.setProperty("webdriver.gecko.driver", "C:\\instalki\\geckodriver.exe");

    InternetExplorerOptions opt =  new InternetExplorerOptions();
                opt.requireWindowFocus();
    //          driver=new InternetExplorerDriver(opt);
    //          driver = new ChromeDriver();
    driver = new FirefoxDriver();

   driver.manage().window().maximize();

   WebDriverWait wait = new WebDriverWait( driver, 10);

   driver.get("https://jsfiddle.net/39850x27/2/");
   final By inputField = By.id("ctrl_shift_s");
   final By messageWeWaitFor = By.xpath("//*[text() = 'The Ctrl-SHIFT-S keys were pressed!' ]");
   final By frame = By.name("result");

   // Swift to a frame (our test page is within this frame)
   driver.switchTo().frame(driver.findElement(frame));

   // move a corsor to the field
   wait.until(ExpectedConditions.elementToBeClickable(inputField)).click();

   Actions a = new Actions(driver);

   // Press SHIFT-CTRL-S            
   a.keyDown(Keys.SHIFT)
    .keyDown(Keys.CONTROL)
    .sendKeys("s")
    .build()
    .perform();


  //Wait for a message
 wait.until(ExpectedConditions.visibilityOfElementLocated(messageWeWaitFor));

   System.err.println("Success - Ctrl-Shift-S were pressed !!!");

   // Sleep some time (to see the message is really on the page)        
   Thread.sleep(5000);

   // Release SHIFT+CTRL keys   
   a.keyUp(Keys.CONTROL)
    .keyUp(Keys.SHIFT)
    .build()
    .perform();

}finally {
    if(driver!=null) {
        driver.quit();
    }
}
Run Code Online (Sandbox Code Playgroud)