2012-06-28 250 views
11

Estoy tratando de usar Selenium WebDriver para ingresar texto en un elemento de entrada GWT que tiene texto predeterminado, "Ingresar ID de usuario". Aquí hay algunas maneras en que he tratado de hacer que esto funcione:¿Cómo puedo eliminar consistentemente el texto predeterminado de un elemento de entrada con Selenium?

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

Lo extraño es que esto solo funciona algunas veces. A veces, termina buscando "Ingresar IDus de usuario", básicamente comenzando a escribir "nombre de usuario" después del texto predeterminado, y sin siquiera terminar eso.

¿Alguna otra forma mejor y más confiable de eliminar el texto predeterminado de un elemento GWT?

Editado para agregar: El HTML del elemento de entrada. Desafortunadamente, no hay mucho que ver, gracias al calor de JS/GWT. Aquí está el campo cuando es no seleccionados:

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

Después de haber hecho clic y dado que enfocar manualmente, el texto predeterminado y la clase "vacío" se eliminan.

El JS a setDefaultText() se llama tanto onBlur() como onChange() si el cambio da como resultado un campo de texto vacío. Supongo que es por eso que el searchField.clear() no está ayudando.

También he pasado por este método en modo de depuración, y en ese caso, nunca funciona. Cuando se ejecuta normalmente, funciona la mayor parte del tiempo. No puedo decir por qué, sin embargo.

+1

Se puede publicar una copia del código HTML del control, y hay alguna javascript que interactúa con el control? – Arran

+2

¿El texto predeterminado en la 'entrada' proviene de un atributo HTML5 'placeholder', o existe algún tipo de JavaScript' onfocus' y 'onblur'? –

Respuesta

18

Bien, el script obviamente se activa cuando el método clear() borra el input y lo deja vacío. Las soluciones que surgieron se dan a continuación.

  1. El ingenuo, presiona Backspace 10 veces:

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

    (StringUtils.repeat() de Apache Commons Lang o Google guayaba de Strings.repeat() puede ser útil)

  2. El más agradable usando Ctrl+A, Delete:

    String del = Keys.chord(Keys.CONTROL, "a") + Keys.DELETE; 
    searchField.sendKeys(del + username); 
    
  3. Eliminar el contenido de la input a través de JavaScript:

    JavascriptExecutor js = (JavascriptExecutor)driver; 
    js.executeScript("arguments[0].value = '';", searchField); 
    searchField.sendKeys(username); 
    
  4. Ajuste del valor de la input a través de JavaScript por completo:

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

Tenga en cuenta que JavaScript no siempre podría funcionar, como se muestra aquí : Why can't I clear an input field with javascript?

+1

Muchas gracias por las ideas. Intenté 2, que funciona la primera vez, pero cuando vuelvo a buscar a un segundo usuario, solo borro el último carácter del primer nombre de usuario. Muy raro. Con la solución número 4, el botón "Buscar" en el que se debe hacer clic para buscar no se activa, porque no hubo eventos de clic o edición. La solución número 3 funciona perfectamente para mí. ¡Gracias! – mcole

+0

Huh. Pensé que el número 2 era una apuesta segura. De todos modos, me alegro de que ayudó! –

0

Por lo que vale, tengo un problema muy similar. WebDriver 2.28.0 y FireFox 18.0.1

También estoy usando GWT, pero puedo reproducirlo con una simple 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> 

esta prueba falla mayor parte del tiempo:

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

podría ser sólo la toma OS centrarse lejos del navegador de una manera que WebDriver no puede controlar. Parece que no obtenemos este problema en el servidor de CI tal vez ese sea el caso.

0

No puedo agregar un comentario todavía, así que lo estoy poniendo aquí como respuesta. Quiero informarle que si desea usar solo javascript para borrar y/o editar un campo de texto de entrada, entonces el enfoque javascript dado por @slanec no funcionará. He aquí un ejemplo: Why can't I clear an input field with javascript?

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); 
Cuestiones relacionadas