根據「Geb之書」,我開始映射我們門戶的網頁。我更喜歡使用靜態內容閉合塊中定義的變量,並在頁面方法之後訪問它們:不幸的是Geb的一般問題(StaleElementReferenceException和等待超時)
static content = {
buttonSend { $("input", type: "submit", nicetitle: "Senden") }
}
def sendLetter() {
waitFor { buttonSend.isDisplayed() }
buttonSend.click()
}
,有時我得到一個蓋布等待超時異常(後60秒),甚至更糟的是我得到了著名的「 StaleElementReferenceException」。
使用「的IsEnabled」,而不是「isDisplayed」,但對於「StaleElementReferenceException」的時候,我可以避開等待超時我只能套用以下解決方案:
def sendLetter() {
waitFor { buttonSend.isEnabled() }
try {
buttonSend.click()
} catch (StaleElementReferenceException e) {
log.info(e.getMessage())
buttonSend.click()
}
}
我想,這個解決方案是不是真的很好但是我不能像另一篇文章中描述的那樣明確地等待。因此,我有一些一般問題:
- 我應該避免在頁面動態時使用靜態內容定義嗎?
- 什麼時間或事件Geb刷新其DOM?我如何觸發DOM刷新?
- 爲什麼在使用CSS選擇器時仍然會出現「StaleElementReferenceException」?
我希望每個提示有助於理解或解決此問題。最好的辦法是有一個簡單的代碼示例,因爲我仍然是初學者。謝謝!
這個非常有趣和詳細的回答非常感謝。用你的所有例子,我永遠不會面對陳舊的元素! :-)我認爲這個例外的主要原因是在訪問頁面元素之前缺少檢查器。有時候,我只是使用了已經陳舊的頁面對象的引用。酷,我又學到了更多關於Geb的知識!謝謝,吉姆! – AndyDoe