在 Selenium WebDriver 中按 Ctrl + A

Posted

技术标签:

【中文标题】在 Selenium WebDriver 中按 Ctrl + A【英文标题】:Pressing Ctrl + A in Selenium WebDriver 【发布时间】:2012-07-15 06:24:21 【问题描述】:

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

我检查了 Selenium 库,发现 Selenium 只允许按下 special 和 function keys 的按键。

【问题讨论】:

您可以从:***.com/questions/11578768/…得到答案 编程语言在a comment to an answer公开。 【参考方案1】:

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

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

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


对于使用 Selenium Ruby 绑定:

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

    driver.action.key_down(:control)
                 .send_keys("a")
                 .key_up(:control)
                 .perform

【讨论】:

我错过了用语言来讲述。我将红宝石与硒一起使用 谢谢。但这对我不起作用。我仍然无法复制编辑器中的所有文本。我在 firefox 3.6 或 firefox 11 上使用 selenium 2.20。 使用 selenium-webdriver ruby​​ gem 为我工作,使用 firefox 驱动程序,但这不适用于 chrome 驱动程序。 对我来说也一样。可以在 Firefox 中使用,但不能在 chrome 中使用。 我相信 ruby​​ 你可以做到send_keys(:control, "a")【参考方案2】:

要点击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

【讨论】:

别忘了有 CONTROL 键的 keyUp 否则你会在以后的测试中遇到奇怪的错误。 更完整的答案应该包括keyUp。由于 OP 没有离开大楼,这应该是可能的(同时验证它是否确实有效)。你可以edit your answer。【参考方案3】:

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

例如,如果 we 是输入 IWebElement,则以下语句将选择其所有内容:

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

【讨论】:

谢谢。我一直在找这个。 太棒了。通过使用您的评论,在使用 Rselenium 的 R 语言中,我也得到了 Control+A 的结果。在这种情况下,我必须输入:page$sendKeysToActiveElement(list(key = 'control',"a", key = 'control')) 它也适用于 Python 和几个键(尽管the identifiers for the keys are in uppercase 和 Python 中的函数名称是蛇形大小写 - send_keys)。例如。对于 Shift + Alt + Y:send_keys(Keys.SHIFT + Keys.ALT + "y" + Keys.SHIFT + Keys.ALT)【参考方案4】:

你可以试试这个:

driver.findElement(By.xpath(id("anything")).sendKeys(Keys.CONTROL + "a");

【讨论】:

谢谢,这对我的 python 应用程序有帮助,使用 driver.send_keys(Keys.TAB)【参考方案5】:

由于 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();
    

【讨论】:

这在 1980 年代的终端中是正确的,但在这里也可以吗?【参考方案6】:

对于 Python:

ActionChains(driver).key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL).perform();

【讨论】:

【参考方案7】:

C# 中最简单的答案(如果您喜欢 C#)。

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

这个答案几乎给出了by Hari Reddy,但我已经解决了他在某些关键字上弄错了的情况,添加了 KeyUp 或者你在离开控制键时一团糟。

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

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

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

【讨论】:

【参考方案8】:
WebDriver driver = new FirefoxDriver();

Actions action = new Actions(driver); 

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

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

【讨论】:

【参考方案9】:

它对我有用:

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

【讨论】:

【参考方案10】:
Actions act = new Actions(driver);
act.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).build().perform();

【讨论】:

感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation would greatly improve its long-term value 通过展示为什么这是一个很好的解决问题的方法,并将使其对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。 一般来说,最好在你的答案中添加一些文字,以便更好地向提出问题的人解释:不能保证他直接从代码中理解。 不需要使用 keyDown() 吗(不是反问)?【参考方案11】:

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

像这样:

element.send_keys(:control, 'A')

【讨论】:

【参考方案12】:

这就是我在 Selenium 中使用 C# (Visual Studio 2015) 的方法:

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

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

【讨论】:

这对我不起作用,WebDriver,版本=3.141.0.0。 C# VS 2019(我觉得VS版本无所谓)【参考方案13】:

Java

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

例子:

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

要使用上面的Robot类,你需要import java.awt.Robot;'。

【讨论】:

【参考方案14】:

通过使用 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);
    


【讨论】:

rb 表示机器人?你在哪里初始化 rb ? :) @Csanesz:是的,rb 是 Robot 的实例 可以将Robot初始化为:Robot rb = new Robot();

以上是关于在 Selenium WebDriver 中按 Ctrl + A的主要内容,如果未能解决你的问题,请参考以下文章

如何在Selenium WebDriver中按Ctrl + V.

如何使用Java在Selenium WebDriver中按类名选择下拉值[重复]

尝试在 watir-webdriver/selenium-webdriver 脚本中按 CTRL+单击或 SHIFT+单击时出现“TypeError:无法将字符串转换为整数”

Selenium WebDriver - Chrome - C# - 无法在隐身模式下启动selenium浏览器作为最大化的浏览器

python selenium第一个WebDriver脚本

自动化测试教程Selenium Webdriver in C#.Net