2015-04-28 42 views
1

我有一個應該包含日期的輸入字段。Selenium:element.clear()在sendKeys之前觸發javascript()

假設表單在字段中加載了一個值,例如, 「2015年4月28日」。我使用的是使用的webdriver通過選擇元素,然後我做的:

element.clear(); 
element.sendKeys("2015/04/29"); 

不幸的是,當我清除元素,它觸發加載模板「YYYY/MM/DD」,並提出,在一些javascript字段,所以當sendKeys()出現時,endresult是「yyyy/MM/dd2015/04/29」。

當您手動執行步驟時,如果您到該字段並選擇其中的所有內容並刪除它,它不會加載模板直到切換到另一個元素。

所以JavaScript似乎不是簡單地通過改變字段觸發,而是像失去焦點一樣。我已經嘗試了多種方法來集中輸入元素上:

new Actions(driver).moveToElement(element).perform(); 
new Actions(driver).moveToElement(element).click().perform(); 
element.click() 
element.sendKeys("") // before the other sendKeys 

然而,當我使用webdriver的同樣的事情持續發生。 所以兩個問題:

  • 你怎麼處理一般javascript調用由執行,但可能會影響你在做什麼動作觸發的異步?等待?
  • 在這個特定的問題它似乎是焦點驅動的,有沒有某種方式,該領域失去了clear()和sendKeys()之間的焦點?

UPDATE

要闡述:它是有一個更新的字段值「變」,「模糊」和「焦點訪談」中運行的JavaScript方法「文本」輸入字段。

所以我運行element.clear()其中必須因爲清除代碼後插入模板數據就觸發這三個之一。

當我到達element.sendKeys()時,傷害就完成了。

因此,在clear()和sendKeys()之間,在網站上調用「change」,「blur」或「focus」,對我來說最合乎邏輯的解釋是該領域以某種方式失去了焦點。

回答

0

的問題實際上是描述in this post可鏈接到其不幸設置爲 「WorkingAsIntended」 一selenium bug

基本上:clear()觸發change事件。

我的解決方案(基於上述職位的答案)是:

Actions navigator = new Actions(driver); 
    navigator.click(element) 
     .sendKeys(Keys.END) 
     .keyDown(Keys.SHIFT) 
     .sendKeys(Keys.HOME) 
     .keyUp(Keys.SHIFT) 
     .sendKeys(Keys.BACK_SPACE) 
     .perform(); 

在這之後我做element.sendKeys()

0

幾個星期前我有一個類似的問題。事情是我只偶爾遇到了問題。通過在while循環中封裝進程來解決它,在sendkeys()發送後檢索日期。然後將檢索到的日期與正則表達式進行比較,如果日期與正則表達式不匹配,那麼我再次重複clear() - > sendKeys()動作。

爲了回答你的第一個問題,我使用了一個自定義的方法,它一直等待活動請求的數量== 0.不知道你的第二個問題。

1

您可以嘗試通過發回退格來清除輸入。

public static void clearWithBackspace(WebElement input) { 
    while(input.getAttribute("value").length() > 0) { 
     input.sendKeys(Keys.BACK_SPACE); 
    } 
} 

(或一些變化,你在一個sendKeys調用發送的BACK_SPACE秒,然後你想要的文字正確的金額。)

或者,設置由JavascriptExecutor執行JavaScript的輸入值。

你怎麼一般處理異步JavaScript調用

我等待。無論是一些估計的金額或如果我想具體:執行我自己的腳本,並等待完成。這是有效的,因爲JavaScript的事件循環只會在其他所有事情完成時執行腳本。這樣的事情:

public static void waitForScriptExecution() { 
    executeJs("var sc = document.createElement('script'); sc.innerHTML = 'window.allDone = true;'; document.body.appendChild(sc);"); 
    int maxWait = 6000; 
    int waitTimeSoFar = 0; 
    int waitIntervalMs = 500; 
    do { 
     if (executeJs("return window.allDone").equals("true")) { 
      break; 
     } 
     waitFor(waitIntervalMs, MILLISECONDS); 
     waitTimeSoFar = waitTimeSoFar + waitIntervalMs; 
    } while (waitTimeSoFar < maxWait); 
    if (waitTimeSoFar >= maxWait) { 
     // TODO handle timeout 
    } 
} 

public static String executeJs(String script) { 
    JavascriptExecutor js = (JavascriptExecutor) driver; 
    Object result = js.executeScript(script); 
    return result != null ? result.toString() : null; 
} 

public static void waitFor(long count, TimeUnit timeUnit) { 
    try { 
     Thread.sleep(timeUnit.toMillis(count)); 
    } catch (InterruptedException e) { 
     throw new RuntimeException(e); 
    } 
} 
1

檢查一下,可能有幫助。 類似於ekuusela建議的, 但您可以嘗試Ctrl + A然後鍵入。

https://groups.google.com/forum/#!topic/selenium-users/OqRAQmmABJY

添加的例子是爲了完整性,

element.sendKeys(Keys.chord(Keys.CONTROL, "a"), value)); 
element.sendKeys(Keys.chord(Keys.END, Keys.BACKSPACE, Keys.BACKSPACE, ... (enough backspaces to erase the field)), value)).