我正在尝试使用Selenium WebDriver将文本输入到具有默认文本“输入用户ID”的GWT输入元素。以下是我尝试使用此方法的几种方法:
searchField.click();
if(!searchField.getAttribute("value").isEmpty()) {
// clear field, if not already empty
searchField.clear();
}
if(!searchField.getAttribute("value").isEmpty()) {
// if it still didn't clear, click away and click back
externalLinksHeader.click();
searchField.click();
}
searchField.sendKeys(username);
奇怪的是上面这个只在某些时候起作用。有时,它最终搜索“输入用户ID”,基本上开始在默认文本后键入“用户名” - 甚至没有完成。
从GWT元素中清除默认文本的其他更好,更可靠的方法是什么?
编辑添加:输入元素的HTML。不幸的是,由于JS / GWT的热度,没有太多可看的东西。这是未被选中的领域:
<input type="text" class="gwt-TextBox empty" maxlength="40">
点击它并手动对焦后,默认文本和“空”类被删除。
如果更改导致空文本字段,则setDefaultText()
和onBlur()
都会被调用onChange()
和searchField.clear()
。猜猜这就是{{1}}没有帮助的原因。
我也在调试模式中逐步完成了这个方法,在这种情况下,它永远不会工作。当正常运行时,它在大多数时间都有效。我不能说为什么。
答案 0 :(得分:19)
好的,当clear()
方法清除input
并将其留空时,脚本显然会启动。它提出的解决方案如下。
天真的,按Backspace 10次:
String b = Keys.BACK_SPACE.toString();
searchField.sendKeys(b+b+b+b+b+b+b+b+b+b + username);
(来自Apache Commons Lang的StringUtils.repeat()
或Google Guava的Strings.repeat()
可能会派上用场)
使用Ctrl+A, Delete的更好的人:
String del = Keys.chord(Keys.CONTROL, "a") + Keys.DELETE;
searchField.sendKeys(del + username);
通过JavaScript删除input
的内容:
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("arguments[0].value = '';", searchField);
searchField.sendKeys(username);
完全通过JavaScript设置input
的值:
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("arguments[0].value = '" + username + "';", searchField);
请注意,javascript可能并不总是有效,如下所示:Why can't I clear an input field with javascript?
答案 1 :(得分:0)
对于它的价值,我有一个非常类似的问题。 WebDriver 2.28.0和FireFox 18.0.1
我也在使用GWT,但可以使用简单的HTML / JS重现它:
<html>
<body>
<div>
<h3>Box one</h3>
<input id="boxOne" type="text" onfocus="if (this.value == 'foo') this.value = '';" onblur="if (this.value == '') this.value = 'foo';"/>
</div>
<div>
<h3>Box two</h3>
<input id="boxTwo" type="text" />
</div>
</body>
</html>
此测试大部分时间都失败了:
@Test
public void testTextFocusBlurDirect() throws Exception {
FirefoxDriver driver = new FirefoxDriver();
driver.navigate().to(getClass().getResource("/TestTextFocusBlur.html"));
for (int i = 0; i < 200; i++) {
String magic = "test" + System.currentTimeMillis();
driver.findElementById("boxOne").clear();
Thread.sleep(100);
driver.findElementById("boxOne").sendKeys(magic);
Thread.sleep(100);
driver.findElementById("boxTwo").clear();
Thread.sleep(100);
driver.findElementById("boxTwo").sendKeys("" + i);
Thread.sleep(100);
assertEquals(magic, driver.findElementById("boxOne").getAttribute("value"));
}
driver.quit();
}
可能只是操作系统以WebDriver无法控制的方式将注意力从浏览器上移开。我们似乎没有在CI服务器上遇到这个问题,可能就是这种情况。
答案 2 :(得分:0)
我还不能添加评论,所以我在这里作为答案。我想通知您,如果您只想使用javascript清除和/或编辑输入文本字段,那么@slanec给出的javascript方法将无效。以下是一个示例:Why can't I clear an input field with javascript?
答案 3 :(得分:0)
In case you use c# then solution would be :
// provide some text
webElement.SendKeys("aa");
// this is how you use this in C# , VS
String b = Keys.Backspace.ToString();
// then provide back space few times
webElement.SendKeys(b + b + b + b + b + b + b + b + b + b);