49

有没有办法使用 Selenium WebDriver按Ctrl+键?A

我检查了 Selenium 库,发现 Selenium 只允许按下特殊键和功能键

4

14 回答 14

64

另一种解决方案(在 Java 中,因为您没有告诉我们您的语言 - 但它在所有具有Keys类的语言中都以相同的方式工作):

String selectAll = Keys.chord(Keys.CONTROL, "a");
driver.findElement(By.whatever("anything")).sendKeys(selectAll);

您可以使用它来选择<input>或整个页面上的整个文本(只需找到html元素并将其发送给它)。


使用 Selenium Ruby 绑定:

Ruby 绑定中的中没有chord()方法。因此,正如 Hari Reddy 所建议的,您必须使用 Selenium Advanced 用户交互 API,请参阅:KeysActionBuilder

    driver.action.key_down(:control)
                 .send_keys("a")
                 .key_up(:control)
                 .perform
于 2012-07-16T17:52:47.370 回答
16

要单击Ctrl+ A,您可以使用 Actions 来完成

  Actions action = new Actions(); 
  action.keyDown(Keys.CONTROL).sendKeys(String.valueOf('\u0061')).perform();

\u0061 代表字符'a'

\u0041 代表字符'A'

要按其他字符,请参阅 unicode 字符表 - http://unicode.org/charts/PDF/U0000.pdf

于 2012-07-16T15:52:35.893 回答
12

在 C# 的 Selenium 中,发送Keys.Control只是切换Control键的状态:如果它启动,则它变为关闭;如果它下降,那么它就会上升。所以要模拟按下Control+A,发送Keys.Control两次,一次在发送“a”之前,然后在之后。

例如,如果我们是一个输入 IWebElement,下面的语句将选择它的所有内容:

we.SendKeys(Keys.Control + "a" + Keys.Control);

于 2016-01-16T19:21:21.347 回答
5

你可以试试这个:

driver.findElement(By.xpath(id("anything")).sendKeys(Keys.CONTROL + "a");
于 2015-09-30T07:42:25.123 回答
3

因为Ctrl+A映射到 ASCII 码值 1(Ctrl+B到 2,最多,Ctrl+Z到 26)。

尝试:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using OpenQA.Selenium;
using OpenQA.Selenium.IE;
using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium.Interactions;
using OpenQA.Selenium.Internal;
using OpenQA.Selenium.Remote;

namespace SeleniumHqTest
{
    class Test
    {
            IWebDriver driver = new InternetExplorerDriver();
            driver.Navigate().GoToUrl("http://localhost");
            IWebElement el = driver.FindElement(By.Id("an_element_id"));
            char c = '\u0001'; // ASCII code 1 for Ctrl-A
            el.SendKeys(Convert.ToString(c));
            driver.Quit();
    }
}
于 2012-07-16T14:31:05.223 回答
3

对于 Python:

ActionChains(driver).key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL).perform();
于 2018-06-02T09:39:50.990 回答
2

C# 中最简单的答案(如果您倾向于 C#)。

Actions action = new Actions(); 
action.KeyDown(OpenQA.Selenium.Keys.Control).SendKeys("a").KeyUp(OpenQA.Selenium.Keys.Control).perform();

这个答案几乎是由 Hari Reddy给出的,但我已经修复了他在某些关键字上弄错了的情况,添加了 KeyUp 或者你把控制键弄得一团糟。

我还在OpenQA.Selenium.Keys上添加了说明,因为您可能还需要在与我相同的类上使用 Windows.Forms 需要这种说明。

最后,我输入“a”,因为我发现这是最简单的方法,而且我看不到 OP 的任何建议,即他们不想要最简单的答案。

非常感谢 Hari Reddy,因为我是 Actions 类用法的新手,并且我正在编写许多不同的命令。以他展示的方式将它们链接在一起更快:-)

于 2019-01-16T14:12:48.940 回答
0
WebDriver driver = new FirefoxDriver();

Actions action = new Actions(driver); 

action.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).perform();

此方法删除了将 unicode 转换为字符串的额外调用( String.ValueOf() )。

于 2016-01-07T20:26:05.873 回答
0

我发现在 Ruby 中,您可以将两个参数传递给send_keys

像这样:

element.send_keys(:control, 'A')
于 2016-05-02T19:20:01.747 回答
0

这个对我有用:

OpenQA.Selenium.Interactions.Actions action 
    = new OpenQA.Selenium.Interactions.Actions(browser);
action.KeyDown(OpenQA.Selenium.Keys.Control)
    .SendKeys("a").KeyUp(OpenQA.Selenium.Keys.Control).Perform();
于 2016-05-07T16:22:42.767 回答
0

通过使用 Java 中的Robot类:

import java.awt.Robot;
import java.awt.event.KeyEvent;

public class Test1
{
    public static void main(String[] args) throws Exception
    {
        WebDriver d1 = new FirefoxDriver();
        d1.navigate().to("https://www.youtube.com/");
        Thread.sleep(3000);
        Robot rb = new Robot();
        rb.keyPress(KeyEvent.VK_TAB);
        rb.keyRelease(KeyEvent.VK_TAB);
        rb.keyPress(KeyEvent.VK_TAB);
        rb.keyRelease(KeyEvent.VK_TAB);

        // Perform [Ctrl+A] Operation - it works
        rb.keyPress(KeyEvent.VK_CONTROL);
        rb.keyPress(KeyEvent.VK_A);

        // It needs to release key after pressing
        rb.keyRelease(KeyEvent.VK_A);
        rb.keyRelease(KeyEvent.VK_CONTROL);
        Thread.sleep(3000);
    }
}

于 2016-07-25T15:20:49.957 回答
0

这对我使用 C# (Visual Studio 2015) 和 Selenium 有用:

new Actions(driver).SendKeys(Keys.Control + "A").Perform();

您可以在中间使用 (+) 添加任意数量的键。

于 2016-09-29T13:05:43.037 回答
0

爪哇

Robot类将比通过Selenium sendkeys 发送密钥更有效。请试试:

例子:

Robot rb = new Robot();
rb.keyPress(KeyEvent.VK_CONTROL);
rb.keyPress(KeyEvent.VK_A);

要使用上述Robot类,您需要import java.awt.Robot;'.

于 2017-11-07T12:35:16.687 回答
0
Actions act = new Actions(driver);
act.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).build().perform();
于 2019-02-22T12:22:26.917 回答