【发布时间】:2012-07-15 06:24:21
【问题描述】:
有没有办法使用 Selenium WebDriver 按 Ctrl + A 键?
我检查了 Selenium 库,发现 Selenium 只允许按下 special 和 function keys 的按键。
【问题讨论】:
-
编程语言在a comment to an answer公开。
标签: ruby selenium selenium-webdriver keypress
有没有办法使用 Selenium WebDriver 按 Ctrl + A 键?
我检查了 Selenium 库,发现 Selenium 只允许按下 special 和 function keys 的按键。
【问题讨论】:
标签: ruby selenium selenium-webdriver keypress
另一种解决方案(在 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
【讨论】:
send_keys(:control, "a")
要点击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
【讨论】:
keyUp。由于 OP 没有离开大楼,这应该是可能的(同时验证它是否确实有效)。你可以edit your answer。
在 C# 的 Selenium 中,发送 Keys.Control 只是切换 Control 键的状态:如果它处于启动状态,则它变为关闭;如果它下降,那么它就会上升。所以要模拟按下 Control+A,发送两次Keys.Control,一次在发送“a”之前,然后一次之后。
例如,如果 we 是输入 IWebElement,则以下语句将选择其所有内容:
we.SendKeys(Keys.Control + "a" + Keys.Control);
【讨论】:
page$sendKeysToActiveElement(list(key = 'control',"a", key = 'control'))
send_keys)。例如。对于 Shift + Alt + Y:send_keys(Keys.SHIFT + Keys.ALT + "y" + Keys.SHIFT + Keys.ALT)
你可以试试这个:
driver.findElement(By.xpath(id("anything")).sendKeys(Keys.CONTROL + "a");
【讨论】:
driver.send_keys(Keys.TAB)
由于 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();
}
}
【讨论】:
对于 Python:
ActionChains(driver).key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL).perform();
【讨论】:
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 类用法的新手,并且我正在编写许多不同的命令。以他展示的方式将它们链接在一起更快:-)
【讨论】:
WebDriver driver = new FirefoxDriver();
Actions action = new Actions(driver);
action.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).perform();
此方法删除了将 unicode 转换为字符串的额外调用 (String.ValueOf())。
【讨论】:
它对我有用:
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();
【讨论】:
Actions act = new Actions(driver);
act.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).build().perform();
【讨论】:
我发现在 Ruby 中,你可以将两个参数传递给send_keys
像这样:
element.send_keys(:control, 'A')
【讨论】:
这就是我在 Selenium 中使用 C# (Visual Studio 2015) 的方法:
new Actions(driver).SendKeys(Keys.Control + "A").Perform();
您可以在中间使用 (+) 添加任意数量的键。
【讨论】:
Robot 类将比通过 Selenium sendkeys 发送密钥更有效。请尝试:
例子:
Robot rb = new Robot();
rb.keyPress(KeyEvent.VK_CONTROL);
rb.keyPress(KeyEvent.VK_A);
要使用上面的Robot类,你需要import java.awt.Robot;'。
【讨论】:
通过使用 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);
}
}
【讨论】: