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);
但我仍然不明白如何在其中发送密钥。
【问题讨论】:
检查我的答案。它包含 JavascripExecutorsendKeys()
。
你能发布完整的错误信息吗?
【参考方案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】:您似乎正在尝试使用标签名称进行定位,即<input>
在这种情况下,这个标签可以在同一个页面中有多个。
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 WebDriver 和 Python 定位用户名和密码元素