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

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();

我试图使用SeleniumWebDriver将文本输入到具有默认文本“EnterUserID”的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);
奇怪的是,上面所说的只是在某些时候起作用。有时,它最终搜索“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);