2016-05-26 7 views
1

Ich versuche nur, einen Text in Großbuchstaben mit einer Reihe von Tastaturaktionen eingeben. Hier Code mit der Schnittstelle 'Aktion':Serie von mehreren Aktionen in Webdriver

WebElement element = driver.findElement(By.id("email")); 
Actions builder = new Actions(driver); 
Action act = builder.moveToElement(element) 
        .keyDown(element,Keys.SHIFT) 
        .sendKeys("vishal") 
        .keyUp(Keys.SHIFT) 
        .build(); 
act.perform(); 

Oben funktioniert gut.

Aber wenn wir keine Schnittstelle verwenden, funktioniert es nicht warum? Obwohl dies gut ausgeführt wird, die Aufgabe aber nicht ausgeführt wird. Ich denke beide sollten funktionieren.

WebElement element = driver.findElement(By.id("email")); 
Actions builder = new Actions(driver); 
builder.moveToElement(element) 
     .keyDown(element,Keys.SHIFT) 
     .sendKeys("vishal") 
     .keyUp(Keys.SHIFT) 
     .build(); 
builder.perform(); 

Antwort

0

Da Actions#build() Methode einen Zustand von selbst zurücksetzt, bevor die Aktion Rückkehr
sehen die Umsetzung hier: http://grepcode.com/file/repo1.maven.org/maven2/org.seleniumhq.selenium/selenium-api/2.18.0/org/openqa/selenium/interactions/Actions.java#Actions.build%28%29

338 
339 public Action More ...build() { 
340 CompositeAction toReturn = action; 
341 resetCompositeAction(); 
342 return toReturn; 
343 } 

Achten Sie auf resetCompositeAction(); Anruf - den Erbauer zurücksetzt.

Wenn Sie dies durchzuführen:

builder............ 
     ........().build(); 
builder.perform(); 

Dann build() die Aktion zurück und setzt einen Zustand builder Objekt.
Dann, wenn Sie builder.perform() anrufen, ist es nichts zu tun.

1

In Ihrem zweiten Beispiel ist es, weil Sie bauen sind() aufrufendann durchführen()

Wenn man sich die Aktionen Klassenimplementierungen dieser beiden Methoden:

/** 
    * Generates a composite action containing all actions so far, ready to be performed (and 
    * resets the internal builder state, so subsequent calls to build() will contain fresh 
    * sequences). 
    * 
    * @return the composite action 
    */ 
    public Action build() { 
    CompositeAction toReturn = action; 
    resetCompositeAction(); 
    return toReturn; 
    } 

    /** 
    * A convenience method for performing the actions without calling build() first. 
    */ 
    public void perform() { 
    build().perform(); 
    } 

Wenn Sie build() aufrufen, wird der interne Status des Builders tatsächlich zurückgesetzt!

Danach rufen Sie perf() es erstellt eine leere Objektreferenz, die kein Verhalten definiert hat.

das Problem zu beheben, schlage ich Ihren Anruf build() mit einem Aufruf an durchführt() wie unten gezeigt ersetzt.

WebElement element = driver.findElement(By.id("email")); 
Actions builder = new Actions(driver); 
builder.moveToElement(element).keyDown(element, Keys.SHIFT).sendKeys("vishal").keyUp(Keys.SHIFT).perform(); 

Ich würde erwarten, dass zu tun, was Sie wollen, basierend auf der Implementierung.

Meine Untersuchung erfolgte gegen Selen v 2.53.0

0
builder.moveToElement(element) 
     .keyDown(element,Keys.SHIFT) 
     .sendKeys("vishal") 
     .keyUp(Keys.SHIFT) 
     .build().perform(); 
Verwandte Themen