如果Selenium2在有限的時間內輪詢後未能檢索到WebElement對象,我有這個想法用於故障切換到JavascriptExecutor。如您所見,該方法具有限制,即在調用getElementByLocator時需要預先定義「故障轉移」JavaScript代碼段。我想不出有什麼辦法來動態地做到這一點。如果任何人都可以幫助我改進這一點,我會將答案提供給最好的建議,儘管它很小。當Selenium2 findElement失敗時,故障轉移到JavascriptExecutor?
// failover example1: "document.getElementById('gbqfb')"
// failover example2: "document.querySelector("div#gbqfb")"
public static WebElement getElementByLocator(final By locator, String failover) {
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS);
.ignoring(NoSuchElementException.class,StaleElementReferenceException.class);
WebElement we = wait.until(ExpectedConditions
.presenceOfElementLocated(locator));
if (we.isNull()) {
JavascriptExecutor js = (JavascriptExecutor) driver;
if (!failover.isEmpty()) {
we = (WebElement)js.executeScript(failover);
if (we.isNull()) LOG.info("Still couldn't get element.");
} else {
LOG.info("No failover String available. Cannot try with " +
"a JavascriptExecutor.");
}
}
return we;
}
我很感激長答案和非常詳細的信息。我的問題的目的是捕捉罕見的邊緣情況,根據我的經驗,有時在從一個版本的Selenium2升級到另一個版本後會發生這種情況,在這種情況下,有時候一個Element不能被常規腳本檢索,並且我試圖避免小編輯在那些需要JavascriptExecutor才能訪問的情況下。因此,試圖提出一種工作故障轉移方法。正如你從我的代碼中看到的,99%的時間,它不會調用JavascriptExecutor。故障轉移僅適用於邊緣情況。 – djangofan
作爲一名測試工程師,我從未在我的日子裏遇到過這種類型的問題,但沒有使用上面提供的內容進行糾正。你說這個元素「不再可以被普通腳本檢索」。這是什麼意思?你提供了一個選擇器來選擇對象,並且你很好去.. – sircapsalot
那麼,我說我的平常代碼工作超過99%的時間,我使用類似於你的方法,但也許稍微更現代化(自我使用FluentWait,ExpectedConditions,LoadableComponent等等。),但我也說根據我的經驗,.findElement()通常不是100%完全可靠的。我想提出一些我可以說的堅定的東西。編寫框架時,這是框架用戶的目標。此外,沒有理由認爲.findElement將是100%,因爲加載DOM不是100%,也不是瞬間... – djangofan