【问题标题】:How to use Sendkeys() without finding element on web page when element is already focused and waiting for input当元素已经聚焦并等待输入时,如何使用Sendkeys()而不在网页上找到元素
【发布时间】:2018-05-11 06:16:48
【问题描述】:

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

现在一旦网页加载它会自动等待用户输入用户名,即用户名已经被关注。那么我可以将密钥发送到这个已经聚焦的元素吗?输入用户名后,我可以使用 TAB 选择下一个输入,即密码,然后再次使用 TAB 选择登录按钮。

【问题讨论】:

  • 那么你的问题是什么?
  • 也许你可以将键发送到body标签来模拟tab操作
  • 嗨@DebanjanB,当特定元素已经聚焦并等待用户输入时,我正在尝试找到一种无需在网页上找到元素的 Sendkeys() 方法。
  • 非常感谢大家的cmets。

标签: java selenium web selenium-iedriver


【解决方案1】:

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

请参阅此处了解更多详情 - https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/WebDriver.TargetLocator.html#activeElement--

【讨论】:

  • 我可以看到该元素处于活动状态,并且在选择 Keys.TAB 时它专注于下一个对象,但是当我尝试将 Keys 发送到该元素时,它不起作用。您还可以建议我应该只使用 Key.TAB 移动到下一个元素还是有一种方法可以移动到下一个活动元素。
  • 它应该与 TAB 一起使用以转到下一个活动元素。您需要对新元素再次使用 activeElement() 方法。
  • 嗨,由于缺少帧而摆弄了一段时间后。我可以使用这个解决方案。
【解决方案2】:

您也可以使用 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 功能。

【讨论】:

    【解决方案3】:

    同样使用下面的代码:

    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");
        }
    

    【讨论】:

    • 你不认为这么多显式等待(显式等待的最坏情况)是不好的做法吗?
    • @cruisepandey,是的,我知道它只是为了暂停,看看标签如何将元素移动到元素。否则自动化脚本中不推荐硬代码等待
    • 嗨@NarendraR,我尝试运行此代码,但出现异常 - *** Element info: {Using=tag name, value=body} at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:214) at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:166)
    【解决方案4】:

    如果你想使用标签按钮到特定的定位器然后

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

    【讨论】:

      【解决方案5】:

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

      KeyboardFocusManager.getCurrentKeyboardFocusManager().focusNextComponent();
      

      了解更多关于这个使用链接https://docs.oracle.com/javase/7/docs/api/java/awt/KeyboardFocusManager.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 2020-09-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-18
        • 1970-01-01
        • 2018-09-21
        相关资源
        最近更新 更多