如何始终如一地从Selenium的输入元素中删除默认文本?

2022-09-04 08:19:02

我正在尝试使用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);

奇怪的是,上面这只在某些时候有效。有时,它最终会搜索“输入用户IDus”,基本上开始在默认文本后键入“用户名” - 甚至没有完成它。

还有其他更好,更可靠的方法来清除GWT元素中的默认文本吗?

编辑以添加:输入元素的 HTML。不幸的是,由于JS / GWT的热度,没有什么可看的。以下是取消选中时的字段:

<input type="text" class="gwt-TextBox empty" maxlength="40">

单击它并手动为其提供焦点后,将删除默认文本和“空”类。

要调用的 JS 将同时调用两者,如果更改导致空文本字段。猜猜这就是为什么没有帮助。setDefaultText()onBlur()onChange()searchField.clear()

我还在调试模式下逐步执行了此方法,在这种情况下,它永远不会起作用。正常运行时,它大部分时间都在工作。不过,我不能说为什么。


答案 1

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

  1. 天真的那个,按退格10次:

    String b = Keys.BACK_SPACE.toString();
    searchField.sendKeys(b+b+b+b+b+b+b+b+b+b + username);
    

    (StringUtils.repeat() 来自 Apache Commons Lang 或 Google Guava's Strings.repeat() 可能会派上用场)

  2. 使用Ctrl+A的更好的那个,删除

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

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

    JavascriptExecutor js = (JavascriptExecutor)driver;
    js.executeScript("arguments[0].value = '" + username + "';", searchField);
    

请注意,javascript 可能并不总是有效,如下所示:为什么我不能使用 javascript 清除输入字段?


答案 2

对于它的价值,我有一个非常相似的问题。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服务器上遇到这个问题,也许就是这样。


推荐