Selenium2 が限られた時間のポーリング後に WebElement オブジェクトの取得に失敗した場合、JavascriptExecutor にフェイルオーバーするという考えがあります。ご覧のとおり、このメソッドには、getElementByLocator を呼び出すときに「フェイルオーバー」Javascript スニペットを事前定義する必要があるという制限があります。これを動的に行う方法は考えられませんでした。誰かがこれを改善するのを手伝ってくれるなら、それがどんなに小さくても、最良の提案への答えを授与します.
// 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;
}