Java 如何使用Selenium一致地从输入元素中删除默认文本?
我试图使用SeleniumWebDriver将文本输入到具有默认文本“EnterUserID”的GWT输入元素中。以下是我尝试过的几种方法:Java 如何使用Selenium一致地从输入元素中删除默认文本?,java,gwt,selenium,webdriver,Java,Gwt,Selenium,Webdriver,我试图使用SeleniumWebDriver将文本输入到具有默认文本“EnterUserID”的GWT输入元素中。以下是我尝试过的几种方法: searchField.click(); if(!searchField.getAttribute("value").isEmpty()) { // clear field, if not already empty searchField.clear();
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);
奇怪的是,上面所说的只是在某些时候起作用。有时,它最终搜索“enteruseridus”,基本上是在默认文本后输入“username”——甚至没有完成
还有其他更好、更可靠的方法从GWT元素中清除默认文本吗
编辑以添加:输入元素的HTML。不幸的是,由于JS/GWT的热度,没有太多可看的内容。以下是未选中的字段:
<input type="text" class="gwt-TextBox empty" maxlength="40">
在我单击它并手动为其指定焦点后,默认文本和“空”类将被删除
如果更改导致文本字段为空,则将同时调用setDefaultText()
和onChange()
的JS。我猜这就是为什么searchField.clear()
没有帮助的原因
我也在调试模式下使用了这个方法,在这种情况下,它永远不会工作。正常运行时,它大部分时间工作。但是我不知道为什么。好的,当
clear()
方法清除输入并将其保留为空时,脚本显然会启动。下面给出了它提出的解决方案
天真的,按10次:
String b = Keys.BACK_SPACE.toString();
searchField.sendKeys(b+b+b+b+b+b+b+b+b+b + username);
(来自Apache Commons Lang或谷歌Guava的可能会派上用场)
更好的方法是:
通过JavaScript删除输入的内容:
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("arguments[0].value = '';", searchField);
searchField.sendKeys(username);
通过JavaScript设置输入的值:
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("arguments[0].value = '" + username + "';", searchField);
请注意,javascript可能并不总是有效的,如下所示:对于它的价值,我有一个非常类似的问题。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();
}
@测试
public void testTextFocusBlurDirect()引发异常{
FirefoxDriver=新的FirefoxDriver();
driver.navigate().to(getClass().getResource(“/TestTextFocusBlur.html”);
对于(int i=0;i<200;i++){
字符串magic=“test”+System.currentTimeMillis();
driver.findElementById(“boxOne”).clear();
睡眠(100);
driver.findElementById(“boxOne”).sendKeys(magic);
睡眠(100);
driver.findElementById(“boxTwo”).clear();
睡眠(100);
driver.findElementById(“boxTwo”).sendKeys(“+i”);
睡眠(100);
assertEquals(magic、driver.findElementById(“boxOne”).getAttribute(“value”));
}
driver.quit();
}
这可能只是操作系统以WebDriver无法控制的方式将焦点从浏览器上移开。我们似乎没有在CI服务器上发现这个问题,也许是这样。我还不能添加评论,所以我将其作为答案放在这里。我想告诉您,如果您只想使用javascript来清除和/或编辑输入文本字段,那么。这里有一个例子:你能发布控件的HTML副本吗?有没有与控件交互的javascript?
输入中的默认文本是否来自占位符
HTML5属性,或者是否有某种onfocus
和onblur
javascript?非常感谢你的想法。我第一次尝试了2,但当我返回搜索第二个用户时,只会删除第一个用户名的最后一个字符。很奇怪。对于解决方案4,必须单击才能搜索的“查找”按钮不会被激活,因为没有单击或编辑事件。解决方案3对我来说非常有效。谢谢呵呵。我认为2号是一个确定的赌注。不管怎样,我很高兴这有帮助!
@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();
}
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);