古い例外に問題があるため、GhostDriver は前回の実行から変更された何かをバブリングしています。
この { Random “Element is no longer attached to the DOM” StaleElementReferenceException } の質問では、16,000 回以上のビューがあり、誰かが競合状態やテスト時の変更について語っていますが、私のコードは非常に高速に実行されるため、何かが変更されたとは信じられません。 .
私は何も変更していません。すべてのコードが高速に実行されます。おそらく、ページ自体がテスト フラグメント実行の短い時間枠で変更されています。
はmyLibWorks.findElements(..
OKで要素を返します。それを使用FluentWait<SearchContext>
すると、メソッドが戻るときに要素が利用可能になります。
それはスローします:
要素がキャッシュに存在しません
要素でjavascriptを実行しようとした後。
これが私のJavaコードの簡略化されたフラグメントです:
by = getBy_A001();
List<WebElement> welCollecN1 = myLibWorks.findElements(driver, timeOutInSeconds, pollingForSecond, by);
if (welCollecN1 != null) {
WebElement wel01 = welCollecN1.iterator().next();
if(wel01 != null)
{
by = getBy_A002();
List<WebElement> welCollecN2 = myLibWorks.findElements(wel01, timeOutInSeconds, pollingForSecond, by);
if (welCollecN2 != null) {
WebElement wel02 = welCollecN2.iterator().next();
if(wel02 != null)
{
String value = null;
value = elm.getText();
if(value.length() == 0) {
//-------------------------------------------------
// REACH here then i think its ok above, this works almost of time too
// THIS line throws "Element does not exist in cache"
value = (String) ((JavascriptExecutor) driver).executeScript(driver, "return arguments[0].innerHTML", wel02); // <<== ERROR
//-------------------------------------------------
}
}
}
}
}
Request => {"headers":{"Accept":"application/json, image/png","Connection":"Keep-Alive","Content-Length":"84" により要素がキャッシュに存在しません,"Content-Type":"application/json; charset=utf-8","Host":"127.0.0.1:4444"},"httpVersion":"1.1","method":"POST","post ":"{\"args\":[{\"ELEMENT\":\":wdc:1371656598440\"}],\"script\":\"引数を返す[0].innerHTML\"}"," url":"/execute","urlParsed":{"anchor":"","query":"","file":"execute","directory":"/","path":"/execute "、"相対的":"/execute","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol": "","source":"/execute","queryKey":{},"chunks":["execute"]},"urlOriginal":"/session/efc7cf60-d8f6-11e2-9f07-192e7e451712/execute"コマンドの継続時間またはタイムアウト: 736 ミリ秒 このエラーに関するドキュメントについては、次のサイトを参照してください。chunks":["execute"]},"urlOriginal":"/session/efc7cf60-d8f6-11e2-9f07-192e7e451712/execute"} コマンドの実行時間またはタイムアウト: 736 ミリ秒 このエラーに関するドキュメントについては、以下を参照してください。chunks":["execute"]},"urlOriginal":"/session/efc7cf60-d8f6-11e2-9f07-192e7e451712/execute"} コマンドの実行時間またはタイムアウト: 736 ミリ秒 このエラーに関するドキュメントについては、以下を参照してください。 http://seleniumhq.org/exceptions/stale_element_reference.htmlビルド情報: バージョン: '2.32.0'、リビジョン: '6c40c18'、時刻: '2013-04-09 17:22:56' システム情報: os.name : 'Linux'、os.arch: 'i386'、os.version: '3.8.0-19-generic'、java.version: '1.7.0_21' セッション ID: efc7cf60-d8f6-11e2-9f07-192e7e451712 ドライバー情報: org.openqa.selenium.remote.RemoteWebDriver 機能 [{platform=LINUX、acceptSslCerts=false、javascriptEnabled=true、browserName=phantomjs、rotatable=false、driverVersion=1.0.3、locationContextEnabled=false、version=1.9.0、cssSelectorsEnabled =true、databaseEnabled=false、handlesAlerts=false、browserConnectionEnabled=false、proxy={proxyType=direct}、nativeEvents=true、webStorageEnabled=false、driverName=ghostdriver、applicationCacheEnabled=false、takeScreenshot=true}]} =======
エラーはここから泡立っているように見えます:
/**
* Retrieves an element from the cache. Will verify that the element is
* still attached to the DOM before returning.
* @param {string} key The element's key in the cache.
* @param {Document=} opt_doc The document whose cache to retrieve the element
* from. Defaults to the current document.
* @return {Element|Window} The cached element.
*/
bot.inject.cache.getElement = function(key, opt_doc) {
key = decodeURIComponent(key);
var doc = opt_doc || document;
var cache = bot.inject.cache.getCache_(doc);
if (!goog.object.containsKey(cache, key)) {
// Throw STALE_ELEMENT_REFERENCE instead of NO_SUCH_ELEMENT since the
// key may have been defined by a prior document's cache.
throw new bot.Error(bot.ErrorCode.STALE_ELEMENT_REFERENCE,
'Element does not exist in cache');
}
var el = cache[key];
// If this is a Window check if it's closed
if (goog.object.containsKey(el, 'setInterval')) {
if (el.closed) {
delete cache[key];
throw new bot.Error(bot.ErrorCode.NO_SUCH_WINDOW,
'Window has been closed.');
}
return el;
}
// Make sure the element is still attached to the DOM before returning.
var node = el;
while (node) {
if (node == doc.documentElement) {
return el;
}
node = node.parentNode;
}
delete cache[key];
throw new bot.Error(bot.ErrorCode.STALE_ELEMENT_REFERENCE,
'Element is no longer attached to the DOM');
};