【问题标题】:'sendKeys' are not working in Selenium WebDriver'sendKeys' 在 Selenium WebDriver 中不起作用
【发布时间】:2014-01-05 17:02:21
【问题描述】:

我无法使用 WebDriver 在我的应用程序中添加任何价值。我的应用程序正在使用框架。

我可以使用driver.findElement(By.name("name")).clear(); 清除我的文本框的值,但我无法使用driver.findElement(By.name("name")).sendKeys("manish"); 输入任何值。 click 命令适用于同一页面上的另一个按钮。

【问题讨论】:

  • 您确定您的注意力集中在正确的框架上吗?
  • 您遇到了什么错误?你能提供堆栈跟踪吗?
  • 是的,我专注于正确的帧,否则我认为以下命令在执行以下操作之前在调试器模式下不应该工作“driver.findElement(By.name(“name”)).clear()”命令我通过使用它设置了一些明确的值,因此它应该专注于正确的框架。而且令人惊讶的是,我在执行以下命令时没有收到任何错误

标签: selenium selenium-webdriver


【解决方案1】:

我也遇到了这个问题,但后来我通过以下方式解决了问题:

myInputElm.click();
myInputElm.clear();
myInputElm.sendKeys('myString');

【讨论】:

  • 是的。我有一个关于为什么会这样的理论。我认为我们这些受此影响的人可能是因为我们试图向其发送密钥的元素位于框架中,也许这有助于 selenium 到达它?谢谢!!
  • 您是否通过在 clear() 之前添加 .click() 方法解决了问题???
【解决方案2】:

sendkeys() 之前,使用 click() 方法(即,在您的情况下:clear()click ()sendKeys()):

driver.findElement(By.name("name")).clear();
driver.findElement(By.name("name")).click(); // Keep this click statement even if you are using click before clear.
driver.findElement(By.name("name")).sendKeys("manish");

【讨论】:

    【解决方案3】:

    在发送密钥之前尝试单击文本框。

    可能是您需要在输入之前在字段上触发一个事件,并希望点击能够做到这一点。

    【讨论】:

    • 如何使用JavaScript点击请指教
    【解决方案4】:

    我遇到了同样的问题,并为此收集了以下解决方案:

    1. 确保元素处于焦点位置 → 尝试先单击它并输入字符串
    2. 如果这个输入框有一些动画,应用一些等待,而不是静态的。您可以等待动画之后的元素。 (我的情况)
    3. 您可以使用 Actions 类进行尝试。

    【讨论】:

    • +1 表示动画提示,这是我的问题。我在 Angular 9 中有一个模态对话框,并且 selenium 在打开动画完成之前开始写入输入。看起来好像动画的结束中断了 sendKeys。就我而言,我收到了一些信件,但不是全部。
    【解决方案5】:

    使用 JavaScript 在字段中单击,然后使用 sendkeys() 输入值。

    过去我在框架方面遇到过类似的问题。 JavaScript 是最好的方法。

    【讨论】:

    • 如何使用 JavaScript 点击。如果您能提供代码,我将非常感激
    • 我会说 Javascript 永远不应该“成为最好的方式”。这应该只是最后的手段。使用 javascript 执行自动化实际上并不能证明应用程序正在通过用户交互工作,但如果您直接触发 javascript,它就可以工作。我总是会通过 Selenium API 尝试许多其他想法,例如使用 Actions 将鼠标移到字段上等(即通过交互而不是执行来触发 javascript。
    【解决方案6】:

    单击元素也适用于我,但是,我发现的另一个解决方案是使用 JavaScript 输入值,这不需要元素具有焦点:

    var _element= driver.FindElement(By.Id("e123"));
    IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
    js.ExecuteScript("arguments[0].setAttribute('value', 'textBoxValue')", _element);
    

    【讨论】:

    • 谢谢你提到这个,我去试试。在我的情况下,sendkeys 部分工作 - 它非常缓慢地发送 一些 字符,然后在完成之前放弃!所以这不是焦点问题。这是另一个非常奇怪的问题。
    【解决方案7】:

    首先将驱动程序控制传递给框架使用:

      driver.switchTo().frame("pass id/name/index/webelement");
    

    然后,对框架内的webelement执行您想要执行的操作:

     driver.findElement(By.name("name")).sendKeys("manish");
    

    【讨论】:

      【解决方案8】:

      我遇到了同样的问题,复制粘贴也不适用于该文本框。

      下面的代码对我来说很好用:

      WebDriver driver = new FirefoxDriver();
      String mobNo = "99xxxxxxxx";
      WebElement mobileElementIrs = 
      driver.findElement(By.id("mobileNoPrimary"));
      mobileElementIrs.click();
      mobileElementIrs.clear();
      mobileElementIrs.sendKeys(mobNo);
      

      【讨论】:

        【解决方案9】:

        我也遇到过类似的问题

        getDriver().findElement(By.id(idValue)).clear();
        getDriver().findElement(By.id(idValue)).sendKeys(text);
        

        “文本”中的值未完全写入输入。想象一下“Patrick”有时会写“P”另一个“Pat”,...所以测试失败

        修复是一种变通方法并使用 JavaScript:

        ((JavascriptExecutor)getDriver()).executeScript("$('#" + idValue + "').val('" + value + "');");
        

        现在好了。

        代替

        driver.findElement(By.id("idValue")).sendKeys("text");
        

        使用,

        ((JavascriptExecutor)getDriver()).executeScript("$('#" + "idValue" + "').val('" + "text" + "');");
        

        这对我有用。

        【讨论】:

          【解决方案10】:

          我最近遇到了类似的问题,并尝试了上面的一些建议,但没有任何效果。最后,它退回到暴力重试,如果输入框未设置为预期值,则重试。

          出于显而易见的原因,我想避免 thread.sleep,并看到了不同的失败示例,看起来像是某种竞赛或计时条件。

          public void TypeText(string id, string text)
          {
              const int numberOfRetries = 5;
              for (var i = 1; i < numberOfRetries; i++)
              {
                  try
                  {
                      if (TryTypeText())
                          return;
                  }
                  catch (Exception)
                  {
                      if (i == numberOfRetries)
                          throw;
                  }
              }
          
              bool TryTypeText()
              {
                  var element = _webDriver.FindElement(By.Id(id));
                  element.Click();
                  element.Clear();
                  element.SendKeys(text);
                  if (element.TagName.ToLower() == "input"
                      && !DoesElementContainValue(element, text, TimeSpan.FromMilliseconds(1000)))
                  {
                      throw new ApplicationException($"Unable to set the type the text '{text}' into element with id {id}. Value is now '{element.GetAttribute("value")}'");
                  }
                  return true;
              }
          }
          
          private bool DoesElementContainValue(IWebElement webElement, string expected, TimeSpan timeout)
          {
              var wait = new WebDriverWait(_webDriver, timeout);
              return wait.Until(driver =>
              {
                  try
                  {
                      var attribute = webElement.GetAttribute("value");
                      return attribute != null && attribute.Contains(expected);
                  }
                  catch (StaleElementReferenceException)
                  {
                      return false;
                  }
              });
          }
          

          【讨论】:

          • "Unable to 前面的美元符号是什么意思(不是反问)?
          【解决方案11】:

          尝试使用 JavaScript 来 sendkeys()。

          WebElement element = driver.findElement(By.name("name"));
          JavascriptExecutor executor = (JavascriptExecutor)driver;
          executor.executeScript("arguments[0].click();", element);
          

          更多关于 JavaScript 执行器的信息可以在 JavascriptExecutor - Selenium.

          【讨论】:

            【解决方案12】:

            通常我会保留一个临时变量。这应该可以。

            var name = element(by.id('name'));
            name.clear();
            name.sendKeys('anything');
            

            【讨论】:

            • “保留一个临时变量”是什么意思?什么目的?它应该如何使用以及用于什么目的?
            猜你喜欢
            • 2021-11-21
            • 2013-10-10
            • 1970-01-01
            • 2012-10-15
            • 1970-01-01
            • 2023-03-14
            • 1970-01-01
            • 1970-01-01
            • 2020-10-12
            相关资源
            最近更新 更多