如何使用Selenium从输入元素中一致地删除默认文本?

时间:2012-06-28 19:54:18

标签: java gwt selenium webdriver

我正在尝试使用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}}没有帮助的原因。

我也在调试模式中逐步完成了这个方法,在这种情况下,它永远不会工作。当正常运行时,它在大多数时间都有效。我不能说为什么。

4 个答案:

答案 0 :(得分:19)

好的,当clear()方法清除input并将其留空时,脚本显然会启动。它提出的解决方案如下。

  1. 天真的,按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()可能会派上用场)

  2. 使用Ctrl+A, Delete的更好的人:

    String del = Keys.chord(Keys.CONTROL, "a") + Keys.DELETE; 
    searchField.sendKeys(del + username);
    
  3. 通过JavaScript删除input的内容:

    JavascriptExecutor js = (JavascriptExecutor)driver;
    js.executeScript("arguments[0].value = '';", searchField);
    searchField.sendKeys(username);
    
  4. 完全通过JavaScript设置input的值:

    JavascriptExecutor js = (JavascriptExecutor)driver;
    js.executeScript("arguments[0].value = '" + username + "';", searchField);
    
  5. 请注意,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);