2016-05-26 7 views
1

私は、キーボード操作のセットを使用して大文字でテキストを入力しようとしています。ここでは、「アクション」インターフェースを使用したコード: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(); 

上記はうまくいきます。

私たちはインターフェイスを使用しない場合、それはなぜ動作していない???これは正常に実行されていますが、タスクを実行していません。私は両方がうまくいくと思う。

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

答えて

0

Actions#build()方法は、アクションを返す前に自身の状態をリセットするので、
は、ここでの実装を参照してください。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 } 

ご注意resetCompositeAction();コールに - それはビルダーをリセットします。

あなたがこれを実行する場合:

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

その後build()は、アクションを返し、builderオブジェクトの状態をリセットします。
builder.perform()に電話をかけても何も起こりません。あなたはこれらの二つの方法のアクションクラスの実装を見てみると

1

あなたがビルドを呼んでいるので、あなたの第二の例では、それは(だ)その後、)は(

を実行します。

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

build()と呼ぶと、ビルダーの内部状態が実際にリセットされます!

を呼び出すと、perform()は動作が定義されていない空のオブジェクト参照を再構築します。

問題を修正するには、私はを呼び出してビルド()にお電話を置き換える提案下図のように)(実行

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

私は、実装に基づいて、あなたが望むことをすることが期待されます。

私の調査は、セレンVに対して行われた2.53.0

0
builder.moveToElement(element) 
     .keyDown(element,Keys.SHIFT) 
     .sendKeys("vishal") 
     .keyUp(Keys.SHIFT) 
     .build().perform(); 
関連する問題