12

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

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

4

4 回答 4

22

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

  1. 天真的,按Backspace10 次:

    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 的Strings.repeat()可能会派上用场)

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

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

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

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

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

于 2012-07-01T07:43:33.560 回答
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 服务器上遇到这个问题,也许是这样。

于 2013-02-05T13:41:53.037 回答
0

我还不能添加评论,所以我把它作为答案在这里。我想通知您,如果您只想使用 javascript 来清除和/或编辑输入文本字段,那么@slanec提供的 javascript 方法将不起作用。这是一个示例:为什么我不能使用 javascript 清除输入字段?

于 2016-08-15T01:16:38.970 回答
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);
于 2017-12-05T18:19:43.513 回答