GhostDriver выбрасывает устаревшее исключение "Элемент не существует в кэше" при выполнении JavaScript на существующем элементе
Имея проблемы с устаревшими исключениями, GhostDriver пузырится, что-то было изменено, так как при последнем выполнении
В этом вопросе { Случайный "Элемент больше не присоединен к DOM" StaleElementReferenceException}, который имеет более 16 000 просмотров, кто-то рассказывает об условиях гонки и изменениях во время теста, но мой код выполняется так быстро, что я не могу поверить, что что-то изменилось,
Я ничего не меняю, весь код выполняется быстро, возможно, сама страница меняется на небольшом временном интервале выполнения тестового фрагмента.myLibWorks.findElements(..
все в порядке и возвращает элементы, его использование 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 ":" / выполнить " "urlParsed":{"якорь": "", "запрос": "", "файл": "выполнить", "каталог": "/", "путь":" / выполнение ", "родственник": "/ выполнить", "порт": "", "хозяин": "", "пароль": "", "пользователь": "", "USERINFO": "", "власть": "", "протокол": "", "источник": "/ выполнить","queryKey":{},"куски":["выполнить"]},"urlOriginal":"/ сеанса /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' Идентификатор сеанса: efc7cf60-d8f6-11e2-9f07-192e7e451712 Информация о драйвере: org.openqa.selenium.remote.RemoteWebDriver Capabilities [{platform=LINUX, acceptSslCerts=false, javascriptEnabled=true, browserName=phantomjs, roatable=false, driverVersion=1.0.3, locationContextEnabled=false, версия =1.9.0, cssSelectorsEnabled=true, databaseEnabled=false, handlesAlerts=false, browserConnectionEn {proxyType=direct}, nativeEvents=true, webStorageEnabled=false, driverName=ghostdriver, applicationCacheEnabled=false, takeScreenshot=true}]} =======
Ошибка выглядит пузырящейся здесь: https://code.google.com/p/phantomjs/source/browse/src/ghostdriver/third_party/webdriver-atoms/deps.js?r=78d90641df12d10b1f30b2bb4c08b92d6aff5f9b
/**
* 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');
};
1 ответ
У меня была такая же проблема, когда я включал зависимость от GhostDriver и запускал тесты с Chrome Driver. Добавление этих двух дополнительных зависимостей в pom.xml решило проблему:
`` `
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-remote-driver</artifactId>
<version>2.53.0</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>2.53.0</version>
</dependency>
`` `
Не забудьте заменить селеновую версию той, которую вы используете.
Надеюсь, поможет!