当元素已经聚焦并等待输入时,如何使用Sendkeys()而不在网页上查找元素

时间:2018-05-11 06:16:48

标签: java selenium web selenium-iedriver

我正在尝试编写一个简单的基于Java的selenium代码,我将在其中加载页面,为用户名&提供所需的值。密码和登录网页。

现在,一旦网页加载,它会自动等待用户输入用户名,即用户名已经集中。所以我可以将密钥发送到这个已经集中的元素。一旦我输入了用户名,我就可以使用TAB选择下一个输入,即密码,再选择TAB选择Login按钮。

6 个答案:

答案 0 :(得分:2)

试试这个 - WebElement currentElement = driver.switchTo().activeElement();

有关详细信息,请参阅此处 - https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/WebDriver.TargetLocator.html#activeElement--

答案 1 :(得分:0)

如果你想使用Tab键到特定的定位器那么



WebElement inputField = driver.findElement(By.Locator("LocatorValue"));
inputField.sendKeys(Keys.TAB);




答案 2 :(得分:0)

使用以下代码:

driver.findElement(By.tagName("body")).sendKeys(Keys.TAB);

我已经尝试过该演示及其精彩

public static void main(String[] args) throws InterruptedException {
        System.setProperty("webdriver.chrome.driver", "driver/chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.get("https://www.google.com");
        driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
        driver.findElement(By.tagName("body")).sendKeys(Keys.TAB);
        Thread.sleep(1000);
        driver.findElement(By.tagName("body")).sendKeys(Keys.TAB);
        Thread.sleep(1000);
        driver.findElement(By.tagName("body")).sendKeys(Keys.TAB);
        Thread.sleep(1000);
        driver.findElement(By.tagName("body")).sendKeys(Keys.TAB);
        Thread.sleep(1000);
        driver.findElement(By.tagName("body")).sendKeys(Keys.TAB);
        System.out.println("OK");
    }

答案 3 :(得分:0)

或者,您可以使用ROBOT功能作为解决方法。 例如:要发送123456,您可以使用

Robot robot = new Robot();      
robot.keyPress(KeyEvent.VK_1);
robot.keyRelease(KeyEvent.VK_1);
robot.keyPress(KeyEvent.VK_2);
robot.keyRelease(KeyEvent.VK_2);
robot.keyPress(KeyEvent.VK_3);
robot.keyRelease(KeyEvent.VK_3);
robot.keyPress(KeyEvent.VK_4);
robot.keyRelease(KeyEvent.VK_4);
robot.keyPress(KeyEvent.VK_5);
robot.keyRelease(KeyEvent.VK_5);
robot.keyPress(KeyEvent.VK_6);
robot.keyRelease(KeyEvent.VK_6);
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);

我过去也成功使用了Sikuli sendkeys功能。

答案 4 :(得分:0)

要导航到下一个组件,可以使用Class KeyboardFocusManager:

KeyboardFocusManager.getCurrentKeyboardFocusManager().focusNextComponent();

要详细了解此使用链接https://docs.oracle.com/javase/7/docs/api/java/awt/KeyboardFocusManager.html

答案 5 :(得分:-1)

您不应在未找到元素的情况下使用Sendkeys()

正如您提到的一旦网页加载,它会自动等待用户输入用户名,即用户名已经集中,类似于用户名字段,并且是基于HTMLElement.focus()

HTMLElement.focus()

如果可以聚焦,HTMLElement.focus()方法将焦点放在指定的元素上。

但是对于 Selenium 来执行它的任务,浏览器客户端需要处于焦点,类似于浏览器窗口才能成为焦点,基于Window focus()方法。

窗口焦点()

Window focus()方法将焦点设置为当前窗口。

现在从上面的两个讨论中可以明显看出,用户名字段无法帮助 Selenium WebElements 进行交互

的SendKeys()

sendKeys()方法用于模拟键入元素,可以设置其值。现在要设置其粗略值,您必须使用以下方法之一查找/定位元素/元素:

为什么不使用TAB来选择下一个输入

可以使用sendKeys(Keys.TAB);WebElement myElem = driver.switchTo().activeElement();联系,通过switchTo()切换到文档中当前具有焦点的元素,或者使用body元素切换这是无法检测到的。这与Javascript中调用document.activeElement的语义完全匹配。但是有一个陷阱。如果tabindex 不当,您的脚本可能会失败,而不会向您提供任何其他选项,但会退回findElement()

结论

从上面提到的要点 findElement() sendKeys() 结合起来总是一个安全的选择。