Ruby 按Ctrl+;Selenium Web驱动程序中的一个应用程序

Ruby 按Ctrl+;Selenium Web驱动程序中的一个应用程序,ruby,selenium,selenium-webdriver,keypress,Ruby,Selenium,Selenium Webdriver,Keypress,有没有办法使用SeleniumWebDriver按Ctrl+a键 我检查了Selenium库,发现Selenium只允许按特殊键和键。因为Ctrl+A映射到ASCII码值1(Ctrl+B到2,最多,Ctrl+Z到26) 尝试: 要单击Ctrl+A,可以通过操作来完成 Actions action = new Actions(); action.keyDown(Keys.CONTROL).sendKeys(String.valueOf('\u0061')).perform(); \u0

有没有办法使用SeleniumWebDriver按Ctrl+a键

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

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

尝试:

要单击Ctrl+A,可以通过操作来完成

  Actions action = new Actions(); 
  action.keyDown(Keys.CONTROL).sendKeys(String.valueOf('\u0061')).perform();
\u0061表示字符“a”

\u0041表示字符“A”

要按其他字符,请参阅unicode字符表-

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

String selectAll=Keys.chord(Keys.CONTROL,“a”);
driver.findElement(By.whatever(“任何”)).sendKeys(selectAll);
您可以使用它来选择
中的整个文本,或者选择整个页面上的整个文本(只需找到
html
元素并将其发送给它即可)


对于使用Selenium Ruby绑定:

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

driver.action.key\u向下(:控制)
.发送密钥(“a”)
.key_up(:控制)
表演
您可以尝试以下方法:

driver.findElement(By.xpath(id("anything")).sendKeys(Keys.CONTROL + "a");
此方法删除将unicode转换为字符串的额外调用(String.ValueOf())。

在Selenium for C#中,发送
键。Control
只需切换Control键的状态:如果它向上,则变为向下;如果它下降了,那么它就会上升。因此,要模拟按下Control+A,请发送
键。Control
两次,一次在发送“A”之前,然后在发送“A”之后

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


we.SendKeys(Keys.Control+“a”+Keys.Control)

我发现在Ruby中,可以将两个参数传递给
send\u key

像这样:

element.send_keys(:control, 'A')
这对我很有用:

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();
通过在Java中使用Robot类:

导入java.awt.Robot;
导入java.awt.event.KeyEvent;
公共类Test1
{
公共静态void main(字符串[]args)引发异常
{
WebDriver d1=新的FirefoxDriver();
d1.导航()到(“https://www.youtube.com/");
睡眠(3000);
Robot rb=新机器人();
rb.keyPress(KeyEvent.VK_选项卡);
rb.keyRelease(KeyEvent.VK_选项卡);
rb.keyPress(KeyEvent.VK_选项卡);
rb.keyRelease(KeyEvent.VK_选项卡);
//执行[Ctrl+A]操作-它可以工作
rb.keyPress(KeyEvent.VK_控件);
rb.keyPress(KeyEvent.VK_A);
//按下后需要释放按键
rb.keyrease(KeyEvent.VK_A);
rb.keyRelease(KeyEvent.VK_控件);
睡眠(3000);
}
}

这就是我使用C#(Visual Studio 2015)和Selenium时的效果:

new Actions(driver).SendKeys(Keys.Control + "A").Perform();
您可以在中间使用(+)添加任意数量的键。

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

例如:

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

要使用上述Robot类,您需要
导入java.awt.Robot

对于Python:

ActionChains(driver).key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL).perform();
最简单的答案是C(如果你倾向于C)

这个答案几乎给出了,但我已经修复了他在一些关键字上出错的情况,添加了KeyUp,或者你陷入了一团混乱,没有按下控制键

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

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



非常感谢Hari Reddy,因为我是Actions类使用的新手,并且编写了许多不同的命令。用他展示的方式把它们连在一起会更快:-)

我没能用语言来表达。我用红宝石配硒粉。但这对我不起作用。但我仍然无法在编辑器中复制所有文本。我在firefox 3.6或firefox 11上使用selenium 2.20。我使用selenium webdriver ruby gem,使用firefox驱动程序,但这不适用于chrome驱动程序。我也一样。在firefox中工作,但在chrome中不起作用。我相信ruby中你只需发送按键(:control,“a”)
即可。你可以从中得到答案:编程语言在中显示。别忘了输入控制键的keyUp,否则在将来的测试中会出现奇怪的错误。更完整的答案应该包括
keyUp
。由于OP没有离开大楼,这应该是可能的(同时验证它是否真的工作)。你可以,谢谢。我一直在找这个,太好了。通过使用您的注释,在使用Rselenium的R lang中,我也得到了Control+A的结果。在本例中,我必须键入:
page$sendKeysActiveElement(list(key='control','a',key='control'))
它也适用于Python和多个键(尽管Python中的函数名为snake-case-
send_-keys
)。例如,对于Shift+Alt+Y:
send_key(keys.Shift+keys.Alt+“Y”+keys.Shift+keys.Alt)
rb表示机器人?在哪里初始化rb?:)@csanez:是的,rb是Robot的实例。您可以将Robot初始化为:Robot rb=new Robot();谢谢,这帮助了我的python应用程序,使用了
driver.send_keys(keys.TAB)
感谢您提供了这个代码片段,它可能会提供一些有限的、即时的帮助。A通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有其他类似问题的读者更有用。请在您的答案中添加一些解释,包括您所做的假设。通常,最好在答案中添加一些文本,以便更好地向提出问题的人解释:这不能保证他直接从代码中理解。使用keyDown()不是吗
Robot rb = new Robot();
rb.keyPress(KeyEvent.VK_CONTROL);
rb.keyPress(KeyEvent.VK_A);
ActionChains(driver).key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL).perform();
Actions action = new Actions(); 
action.KeyDown(OpenQA.Selenium.Keys.Control).SendKeys("a").KeyUp(OpenQA.Selenium.Keys.Control).perform();
Actions act = new Actions(driver);
act.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).build().perform();