【问题标题】:Selenium can't send keys in found elementSelenium 无法在找到的元素中发送密钥
【发布时间】:2017-05-24 15:40:56
【问题描述】:

我有一个带有这个 outerHtml 的元素 -

<input class="inp-text ps-component ng-valid-maxlength ng-touched ng-pristine ng-empty ng-invalid ng-invalid-required" ng-model-options="{ updateOn: 'default blur', debounce: { 'default': 200, 'blur': 0 } }" required="required" maxlength="100" ng-model="model.name"/>

我试过了-

driver.findElement(By.cssSelector("input"));

可以找到这个元素,但是当我尝试这样做时

driver.findElement(By.cssSelector("input")).sendKeys("something");

java 告诉我element is not visible 异常

driver.findElement(By.cssSelector("input")).click(); 

也不要工作。

如何在这个输入元素中发送一些键?

我找到了部分解决方案。 click() 如果使用它就可以工作:

WebElement input = driver.findElement(By.cssSelector("input"))
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("arguments[0].click();", input);

但我仍然不明白如何在其中发送密钥。

【问题讨论】:

  • 检查我的答案。它包含 JavascripExecutor sendKeys()
  • 你能发布完整的错误信息吗?

标签: java selenium selenium-webdriver css-selectors


【解决方案1】:

尝试对 Expected Conditions 使用显式等待,以确保元素在与之交互之前可见

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("input")));
element.sendKeys("something");

【讨论】:

  • 我说 findElement() 有效。所以它不是隐形的。我不需要等待。
  • @BerasMark 如果findElement() 有效,则意味着DOM 中的元素存在。这并不意味着它可见。您甚至可以在错误消息“java 告诉我该元素不可见”中看到它。
  • 对不起,我的解释有误。
【解决方案2】:

有同样的问题,元素对WebDriver 不可见。相反,JavascriptExecutor 能够帮助我。以下是一些简单的应用程序:

sendKeys() 带有 JavascriptExecutor:

// Cast driver to JavascriptExecutor
JavascriptExecutor jse = (JavascriptExecutor) driver;
jse.executeScript("element = document.getElementsByTagName('input');");
jse.executeScript("element(0).value='" + yourInputString + "';");

click() 带有 JavascriptExecutor:

// Cast driver to JavascriptExecutor
JavascriptExecutor jse = (JavascriptExecutor) driver;
jse.executeScript("javascript:submitForm()");

【讨论】:

  • 你的意思是 element[0] 而不是 element(0)?无论如何,它仍然不会在我的输入表单中发送键
  • 它是element(0)。请注意,您正在获取标记为 input (getElements...) 的所有元素。您需要确保您的输入字段是这些元素中的第一个,或者您将输入发送到列表中的正确元素。
  • 我认为 Selenium 试图模拟实际的键盘和鼠标点击。如果您关心这一点(例如,如果您使用 Selenium 来测试网页是否可供实际用户使用),那么使用 JavaScript 可能会使您尝试测试的内容短路。但是,就我而言,我并不关心这一点,您的解决方案对我有用。 :) 谢谢
【解决方案3】:

有效

js.executeScript("arguments[0].value=\"" + myText + "\";", input);

【讨论】:

    【解决方案4】:

    您似乎正在尝试使用标签名称进行定位,即&lt;input&gt; 在这种情况下,这个标签可以在同一个页面中有多个。

    driver.findElement(By.cssSelector("input"));
    

    不会显示任何错误。 只需使您的定位器更具体,然后尝试例如-

     driver.findElement(By.cssSelector("input.ps-component.ng-valid-maxlength.ng-touched.ng-pristine.ng-empty.ng-invalid.ng-invalid-required")).sendKeys("your_Value");
    

    或者您可以根据页面中的唯一性来定位您的元素。

    【讨论】:

      猜你喜欢
      • 2016-04-23
      • 1970-01-01
      • 2020-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多