Selenium 无法在找到的元素中发送密钥

Posted

技术标签:

【中文标题】Selenium 无法在找到的元素中发送密钥【英文标题】:Selenium can't send keys in found element 【发布时间】: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() 你能发布完整的错误信息吗? 【参考方案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");

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

【讨论】:

以上是关于Selenium 无法在找到的元素中发送密钥的主要内容,如果未能解决你的问题,请参考以下文章

Selenium在页面重新加载后不会在页面上找到元素

selenium web 自动化中的元素不可交互异常

无法在 EditText 字段中发送密钥

如何通过 Selenium WebDriver 和 Python 定位用户名和密码元素

使用 JavascriptExecutor 发送密钥并点击网页元素

Selenium / Java:无法在离子搜索弹出窗口中找到元素