【问题标题】:Selenium sendKeys are not sending all charactersSelenium sendKeys 未发送所有字符
【发布时间】:2016-09-09 01:30:53
【问题描述】:

我正在使用 Java、Selenium 和 Chrome 进行测试自动化。我们的开发人员最近将我们的 UI 从 AngularJS 升级到了 Angular2(不确定这是否重要)。但从那时起,sendKeys 在文本字段中输入不完整的字符。这是一个例子:

    public void enterCustomerDetails()
    {   
        txtFirstName.sendKeys("Joh201605130947AM");
        txtSurname.sendKeys("Doe201605130947AM");
        txtEmail.sendKeys("johndoe@gmail.com");
    }

我也尝试过使用 executeScript。它没有用。它可以输入完整的字符,但表单认为该字段为空。

public void forceSendKeys(WebElement element, String text)
{
    if (element != null)
        ((JavascriptExecutor) this.webDriver).executeScript("arguments[0].value=arguments[1]", element, text);
}

public void enterCustomerDetails()
        {   
            forceSendKeys(txtFirstName, "Joh201605130947AM");
            forceSendKeys(txtSurname, "Doe201605130947AM");
            forceSendKeys(txtEmail, "johndoe@gmail.com");
        }

我还尝试在 .sendKeys 之前使用 .click() 并添加睡眠时间。他们也没有工作。

我有一个想法,从这篇文章中逐个输入字符:How to enter characters one by one in to a text field in selenium webdriver?

它有效,但这意味着我必须将所有代码从 sendKeys 重写为新函数:

    public void sendChar(WebElement element, String value)
{
    element.clear();

    for (int i = 0; i < value.length(); i++){
        char c = value.charAt(i);
        String s = new StringBuilder().append(c).toString();
        element.sendKeys(s);
    }       
}

public void enterCustomerDetails()
    {
        sendChar(txtFirstName, "Joh201605130947AM");
        sendChar(txtSurname, "Doe201605130947AM");      
        sendChar(txtEmail, "johndoe@gmail.com");
    }

如果你们知道更好的方法,请帮忙! :)

【问题讨论】:

  • good.. 看起来只是 Angular2 的问题。
  • 请添加渲染的 html。我认为 txtFirstName 不是输入,而是 DOM 中此输入的父级。首先你必须分析 html,因为有时渲染的 html 看起来和源代码不同。

标签: java selenium angular sendkeys


【解决方案1】:

我认为这是由这个 Angular2 问题 https://github.com/angular/angular/issues/5808 引起的

当输入事件到达太快时,Angular 无法处理它们。

作为一种解决方法,您需要发送单个字符,每个字符之间有一小段延迟。

【讨论】:

    【解决方案2】:

    试试这段代码.. 使用 javascript 设置值的其他方式 WebDriver driver = new FirefoxDriver(); JavascriptExecutor jse = (JavascriptExecutor)驱动程序; jse.executeScript("document.getElementsByName('body')[0].setAttribute('type', 'text');"); driver.findElement(By.xpath("//input[@name='body']")).clear(); driver.findElement(By.xpath("//input[@name='body']")).sendKeys("Ripon: 正文");

    【讨论】:

      【解决方案3】:

      我在使用 NightwatchJS(使用 selenium)进行集成测试时偶然发现了这个错误。

      所以我是为将来来这里的人写这篇文章的。

      我为守夜人写了这个扩展命令

      exports.command = function (selector, value, using) {
          var self = this;
          self.elements(using || 'css selector', selector, function (elems) {
              elems.value.forEach(function (element) {
                  for (var c of value.split('')) {
                      self.elementIdValue(element.ELEMENT, c);
                  }
              });
          });
          return this;
      };
      

      可以这样使用:

      var username = 'integration@test.com';
      browser.setValueSlow('input[ngcontrol=username]', username); //Works with ng2!
      

      NightwatchJS 的 github 上也讨论了这个问题 here

      【讨论】:

        【解决方案4】:

        这是由于 Angular 应用程序中的错误造成的。解决方法是放一个睡眠功能。

        public void setText(By element, String text) {
            sleep(100); // Angular version < 2 apps require this sleep due to a bug
            driver.findElement(element).clear();
            driver.findElement(element).sendKeys(text);
        }
        

        【讨论】:

          【解决方案5】:

          我在 Java Selenium 中也遇到了这个错误。您在编写代码时也可能遇到此错误 - “Webelement 类型中的 sendKeys (CharSequence) 指的是缺少的类型 charSequence”

          我尝试改变等待时间,甚至在主要字符之前输入额外的字符,它们都不起作用。

          我使用的简单技巧是将 Java 编译器版本从 JRE 9 更改为 JRE 10。

          【讨论】:

            【解决方案6】:

            我遇到了同样的问题,如果你仔细看到 selenium 正在改变字符,一些数字执行退格或其他符号,我读到它在使用 selenium 和 vncserver 时发生,我改为 firefox.... .

            如果这不是您的问题,也许可以分部分发送数据:

            input1="Joh201605130947AM"
            txtFirstName.sendKeys(input1[0:7])
            txtFirstName.sendKeys(input1[8:end])
            

            【讨论】:

              【解决方案7】:

              使用

              • 铬 78.0.3904.70,
              • Vaadin 流框架 14.1.3,
              • 硒 3.141.59
              • 和 OpenJDK 11.0.5

              这种行为也会发生,甚至更糟: 我看到这个角色被输入了,然后突然消失了。 一种解决方法是坚持不懈,然后再试一次。然后再次。直到最终输入字符。

                  // Type in every single character
                  for (int i = 0; i < textToType.length(); i++) {
                      boolean typingCharacterWasSuccessful = false;
                      // If typing was not successful before, just type again
                      while (!typingCharacterWasSuccessful) {
                          // Type in the character
                          char singleCharacterToType = textToType.charAt(i);
                          htmlTextfeld.sendKeys(Character.toString(singleCharacterToType));
                          // Wait a little. Maybe alternatively/additionally wait.until(...)
                          Thread.sleep(200);
                          // Check typed in string.
                          String inputValueAfterTyping = htmlTextfeld.getAttribute("value");
                          if (inputValueAfterTyping.length() > i + 1) {
                              // Alternatively: delete everything and start all over
                              throw new Exception("Input value too long. Maybe character typed in twice!?");
                          }
                          // Typing was successful if the value in the input field is as expected (up to now)
                          typingCharacterWasSuccessful
                                  = inputValueAfterTyping.equals(textToType.substring(0, i + 1));
                      }
                  }
              

              【讨论】:

              • 我现在也发生了类似的事情,在 linux 的 google chrome 86 中,它只取第一个字符,所以我决定拆分文本并循环槽逐个添加。这是一个糟糕的解决方案,但最后期限不等。
              【解决方案8】:

              我对 Java 中的大文本也有类似的问题。

              我在键盘相关的方法中使用文本的复制和粘贴解决了这个问题,如以下方法:

              import java.awt.datatransfer.Clipboard;
              import java.awt.datatransfer.StringSelection;
              
              public static void clickAndSetMultilineText(WebElement element, String text) {
                  /** click on element **/
                  element.click();
              
                  /** clear older content of the text using keyboard functionality **/
                  element.sendKeys(Keys.CONTROL + "a"); // select all text
                  element.sendKeys(Keys.DELETE);        // delete old text
                  
                  StringSelection stringSelection= new StringSelection(text);
                  Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
                  clipboard.setContents(stringSelection, null); // copy text to the keyboard
                  element.sendKeys(Keys.CONTROL+"v");           // paste text to the field
              }
              

              希望这有帮助。

              【讨论】:

                猜你喜欢
                • 2013-09-30
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-03-10
                • 1970-01-01
                • 2021-06-24
                • 1970-01-01
                相关资源
                最近更新 更多