【问题标题】:How can I consistently remove the default text from an input element with Selenium?如何使用 Selenium 从输入元素中一致地删除默认文本?
【发布时间】:2012-06-30 09:39:39
【问题描述】:

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

在我单击它并手动为其赋予焦点后,默认文本和“空”类将被删除。

如果更改导致空白文本字段,则setDefaultText() 的 JS 将同时调用 onBlur()onChange()。猜猜这就是searchField.clear() 没有帮助的原因。

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

【问题讨论】:

  • 能否发一份该控件的HTML,有没有与该控件交互的javascript?
  • input 中的默认文本是来自placeholder HTML5 属性,还是有某种onfocusonblur JavaScript?

标签: java gwt selenium webdriver


【解决方案1】:

好的,当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);
    

请注意,javascript 可能并不总是有效,如下所示:Why can't I clear an input field with javascript?

【讨论】:

  • 非常感谢您的想法。我尝试了 2,第一次工作,但是当我回去搜索第二个用户时,只删除了第一个用户名的最后一个字符。很奇怪。对于解决方案编号 4,必须单击以进行搜索的“查找”按钮不会被激活,因为没有单击或编辑事件。解决方案 3 非常适合我。谢谢!
  • 嗯。我认为2号是一个肯定的赌注。无论如何,我很高兴它有帮助!
【解决方案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 服务器上遇到这个问题,也许是这样。

【讨论】:

    【解决方案3】:

    我还不能添加评论,所以我在这里把它作为答案。我想通知您,如果您只想使用 javascript 来清除和/或编辑输入文本字段,那么 @slanec 给出的 javascript 方法将不起作用。这是一个例子:Why can't I clear an input field with javascript?

    【讨论】:

      【解决方案4】:
      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);
      

      【讨论】:

        猜你喜欢
        • 2012-06-03
        • 1970-01-01
        • 2011-02-28
        • 2013-11-23
        • 1970-01-01
        • 1970-01-01
        • 2012-09-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多