2012-06-28 6 views
11

Ich versuche Selenium WebDriver zu verwenden, um Text zu einem GWT-Eingabeelement einzugeben, das den Standardtext "Benutzer-ID eingeben" enthält. Hier sind ein paar Möglichkeiten, die ich habe versucht, dies zu Arbeit zu bekommen:Wie kann ich den Standardtext von einem Eingabeelement mit Selenium konsequent entfernen?

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

Das Merkwürdige des oben ist dies nur einen Teil der Zeit arbeitet. Manchmal endet die Suche nach "Enter User IDus", im Grunde beginnt "username" nach dem Standardtext zu tippen - und nicht einmal das zu beenden.

Gibt es noch bessere, zuverlässigere Möglichkeiten, Standardtext von einem GWT-Element zu löschen?

Bearbeitet zu hinzufügen: Der HTML-Code des Eingabeelements. Leider gibt es nicht viel zu sehen, dank der JS/GWT-Schärfe. Hier ist das Feld, wenn es nicht ausgewählt:

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

Nachdem ich es geklickt haben und es den Fokus manuell angegeben, der Standardtext und die „leere“ Klasse werden entfernt.

Der JS zu setDefaultText() wird sowohl onBlur() als auch onChange() aufgerufen, wenn die Änderung zu einem leeren Textfeld führt. Schätze, deshalb hilft die searchField.clear() nicht.

Ich habe auch diese Methode im Debug-Modus durchlaufen, und in diesem Fall funktioniert es nie. Wenn es normal läuft, funktioniert es die meiste Zeit. Ich kann jedoch nicht sagen warum.

+1

Können Sie eine Kopie der HTML-Code der Kontrollstelle, und gibt es eine Javascript, die mit der Steuerung zusammenwirkt? – Arran

+2

Kommt der Standardtext in der 'input' aus einem 'placeholder'-HTML5-Attribut, oder gibt es eine Art' onfocus' und 'onblur' JavaScript? –

Antwort

18

Okay, offensichtlich tritt das Skript ein, wenn die clear() Methode die input löscht und es leer lässt. Die Lösungen, die es hervorgebracht hat, sind unten aufgeführt.

  1. Die naive ein, drückt Backspace 10-mal:

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

    (StringUtils.repeat() von Apache Commons Lang oder Googles Guava Strings.repeat() nützlich sein kann)

  2. Die schöneren Ctrl+A, Delete mit:

    String del = Keys.chord(Keys.CONTROL, "a") + Keys.DELETE; 
    searchField.sendKeys(del + username); 
    
  3. den Inhalt des input via JavaScript Löschen:

    JavascriptExecutor js = (JavascriptExecutor)driver; 
    js.executeScript("arguments[0].value = '';", searchField); 
    searchField.sendKeys(username); 
    
  4. den Wert des input über JavaScript Einstellung insgesamt:

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

Beachten Sie, dass Sie Javascript nicht immer funktionieren könnte, wie hier gezeigt : Why can't I clear an input field with javascript?

+1

Vielen Dank für die Ideen. Ich habe 2 versucht, was beim ersten Mal funktioniert, aber wenn ich einen zweiten Benutzer suche, lösche ich nur das letzte Zeichen des ersten Benutzernamens. Sehr komisch. Bei Lösungsnummer 4 wird die Schaltfläche "Suchen", auf die zum Suchen geklickt werden muss, nicht aktiviert, da keine Klick- oder Bearbeitungsereignisse vorhanden waren. Lösung Nummer 3 funktioniert perfekt für mich. Vielen Dank! – mcole

+0

Huh. Ich dachte, die Nummer 2 wäre eine sichere Wette. Wie auch immer, ich bin froh, dass es geholfen hat! –

0

Für was es wert ist, habe ich ein sehr ähnliches Problem. WebDriver 2.28.0 und FireFox 18.0.1

Ich verwende GWT auch, aber es kann mit einfachen HTML/JS reproduzieren:

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

Dieser Test die meiste Zeit ausfällt:

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

Es könnte nur die OS Mitnahmen sein Fokussieren Sie den Browser so, dass WebDriver das nicht kontrollieren kann. Wir scheinen dieses Problem auf dem CI-Server nicht zu bekommen, vielleicht ist das der Fall.

0

Ich kann noch keinen Kommentar hinzufügen, also stelle ich es als Antwort hier vor. Ich möchte Sie informieren, dass, wenn Sie nur Javascript verwenden möchten, um ein Eingabetextfeld zu löschen und/oder zu bearbeiten, der JavaScript-Ansatz von @slanec nicht funktioniert. Hier ein Beispiel: 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); 
Verwandte Themen