New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
StaleElementReferenceException #101
Comments
@estivalet, como o erro acontece aleatóriamente, o primeiro passo é reproduzi-lo, para entender o que estar acontecendo. |
@botelhojp pelo que eu entendi, esse erro ocorre no momento que o webdriver tenta interagir com o elemento. O Webdriver até encontra o elemento em um primeiro momento, mas no momento seguinte ao tentar interagir (click, sendkeys, etc) ele não encontra mais o elemento e joga essa exceção. Normalmente está relacionado a eventos ajax que podem modificar elementos da tela. Mas em alguns outros casos é aleatório. Uma primeira solução que eu tive que fazer era procurar o elemento novamente antes de interagir. Eu tinha um método assim:
Depois melhorei e fiz:
Essa era a implementação que eu tinha antes do DBehave e aparentemente tinha resolvido o problema. O principal problema é que isso é aleatório, pode passar umas 10 execuções sem aparecer, mas de uma hora para outra ocorre. Usando o FluentWait esse erro parece não ocorrer mais. O valor de timeout do meu sistema já está bem alto, 40s. |
@estivalet , podemos encerrar essa issue ou você ainda tem problemas? |
Reabrindo... Estou executando meus testes em uma máquina virtual XP com Chrome. Ao rodar o meu teste a exceção ocorre aleatoriamente e em diferentes campos. Rodei em duas máquinas virtuais diferentes e o problema se repete. O problema ocorre também no Firefox. Segue o link para um vídeo para ficar mais fácil de entender (https://docs.google.com/file/d/0B-2oyJZgQ-7IelFfUTZHUjQ2Nms/edit?usp=sharing). O mesmo teste foi executado no mesmo ambiente porém não era máquina virtual e funcionou perfeitamente. Existe alguma recomendação para não rodar testes automatizados em máquinas virtuais? Já tentei aumentar o timeout e o minwait mas não está resolvendo. O mesmo teste roda perfeitamente no Ubuntu e Firefox. O problema é que preciso rodar no XP+Chrome... |
A princípio eu desconfiaria da versões o navegador Chrome e do driver baixado. |
Sim, todos na mesma versão XP, Chrome e Chromedriver |
Rodei todos os nossos testes em um Windows 7 virtualizado com o Firefox 22, no Dbehave 1.2.1-SNAPSHOT gerada em 03/10/2013 11:04. Tudo funcionou. Não acredito que a origem do problema seja a virtualização do SO. Tente reproduzir o erro, criar um passo-a-passo infalível onde o erro sempre aconteça. Dai ficará mais fácil investigar o que pode estar acontecendo. |
Já tentei diversas vezes fazer isso, mas ainda não consegui. Cada vez que eu rodo a mesma estória o comportamento é diferente. Às vezes ocorre o erro, outras passa perfeitamente, e quando o erro ocorre nem sempre é no mesmo campo. O ideal seria se você pudesse rodar os meus testes e com a nossa aplicação. Em outros 2 sistemas que temos aqui nunca apresentou esse erro. Talvez o problema seja em função de um componente personalizado que eu tive que criar, mas de qualquer forma não justifica funcionar em um ambiente e em outro não. Vou seguir investigando... |
Está aparecendo novamente (mas com bem menos frequencia) em outro sistema que estamos automatizando. Geralmente ocorre nas combo boxes. Por exemplo, tenho uma combo box que tenho que escolher a UF. Após escolher a UF tenho que escolher o Município. Quando escolho a UF é disparado um AJAX para popular a combo de município, porém não é apresentado na tela nenhum componente do tipo "Aguardando". O evento é bem rápido. Porém o erro normalmente acontece na combo de munícipio. Está estourando na WebSelect.java nas linhas: public void selectByVisibleText(String value) { Às vezes ocorre na primeira, A maior parte das vezes ocorre na segunda linha como no exemplo abaixo: org.openqa.selenium.StaleElementReferenceException: Element not found in the cache - perhaps the page has changed since it was looked up |
@estivalet acabamos de implementar algo que pode nos ajudar a encontrar a solução. Quando um erro acontece antes somente era gerado um print screen, agora nós também geramos o HTML da página e colocamos um link no relatório do JBehave logo abaixo da imagem do erro. |
@estivalet , existe alguma ação assíncrona de preenchimento do dropdown Setor? Como por exemplo: somente quando o campo UORG é preenchido que os valores do setor são mostrados. |
Sim no campo UORG tenho o seguinte: < select id="usuarioForm:uorgExercicio" name="usuarioForm:uorgExercicio" size="1" tabindex="20" onchange="A4J.AJAX.Submit('usuarioForm',event,{'similarityGroupingId':'usuarioForm:j_id125','parameters':{'usuarioForm:j_id125':'usuarioForm:j_id125'} } )" > O campo setor problemático: < select id="usuarioForm:setorExercicio" name="usuarioForm:setorExercicio" size="1" tabindex="21" > Quando mudo a UORG o campo setor é recarregado. O evento é extremamente rápido tanto que nem tem uma tela do tipo aguardando. |
Vejo que muitas das soluções para o esse erro do Webdriver é buscar o elemento novamente caso ele ocorra. Tipo: public void click() { http://www.jeromemueller.ch/archives/311/webdriver-staleelementreferenceexception |
Estou tentando fazer uma mudança na WebBase.java. Criei o método: public List<WebElement> getElementByLocator(final By locator) {
System.out.println("Get element by locator: " + locator.toString());
final long startTime = System.currentTimeMillis();
Wait<WebDriver> wait = new FluentWait<WebDriver>((WebDriver) runner.getDriver()).withTimeout(30, TimeUnit.SECONDS).pollingEvery(5, TimeUnit.SECONDS).ignoring(StaleElementReferenceException.class);
int tries = 0;
boolean found = false;
List<WebElement> we = null;
while ((System.currentTimeMillis() - startTime) < 10000) {
System.out.println("Searching for element. Try number " + (tries++));
try {
wait.until(ExpectedConditions.visibilityOfElementLocated(locator));
we = driver.findElements(locator);
found = true;
break;
} catch (StaleElementReferenceException e) {
System.out.println("Stale element: \n" + e.getMessage() + "\n");
}
}
long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
if (found) {
System.out.println("Found element after waiting for " + totalTime + " milliseconds.");
} else {
System.out.println("Failed to find element after " + totalTime + " milliseconds.");
}
return we;
} E no método getElements() estou chamando o método acima: for (int i = 0; i < frame.countFrames(); i++) {
frame.switchNextFrame();
List<WebElement> elementsFound = getElementByLocator(by);
if (elementsFound.size() > 0) { Estou rodando diversas vezes, pois como falei o erro é aleatório. Por enquanto parece resolver... vamos ver... |
não funcionou... e já estou meio sem ideia de como fazer para resolver esse problema... ninguém mais teve esse problema até agora??? Parece ser um problema comum do Webdriver. Achei que tratando o StaleElementReferenceException no getElements() iria resolver, mas na verdade o erro sem que ocorre dá linha abaixo da classe WebSelect public void selectByVisibleText(String value) {
WebElement we = getElements().get(0);
String tag = we.getTagName(); <--------------------------- ERRO!!!!!
if (tag.equals("select")) { Eu entendo que no momento do getElements() o WebDriver encontra uma referência válida do elemento, mas no momento em que se recupera o elemento (.get(0)) essa referência já não é mais válida e Se eu coloco um try-catch funciona, mas não é uma solução global para o framework... public void selectByVisibleText(String value) {
WebElement we = getElements().get(0);
String tag;
try {
tag = we.getTagName();
} catch (StaleElementReferenceException sere) {
we = getElements().get(0);
tag = we.getTagName();
} |
Estou lendo alguns artigos (inclusive o que você enviou) para tentar ajudar, mas acredito que teremos que colocar algum recurso avançado ai! Como por exemplo ele ficar tentando até X vezes, ou por algum tempo. |
Por favor, me adicione no PSI para tratarmos deste assunto. |
de select box quando existe ajax.
A solução proposta pelo Julian está funcionando perfeitamente!!! |
Infelizmente reabrindo... @juliancesar agora peguei o erro em um campo textfield (WebTextField.java:53). Acho que temos que fazer um tratamento semelhante ao que você fez para a combo... (org.openqa.selenium.StaleElementReferenceException: Element not found in the cache - perhaps the page has changed since it was looked up Failed to run story stories/execucao/demandas/CadastrarDemandaExterna.storyConverted |
@estivalet , estou estudando uma forma de subir esse tratamento para o driver como um todo, pretendo ter uma versão snapshot para a semana que vêm. |
melhoria nas frases de verificação de texto na tela e em elementos específicos.
Recebo esse erro aleatoriamente durante a execução dos testes automatizados do sistema Ação Fiscal:
Acho que o DBehave não tem um tratamento específico para essa exceção do Webdriver. Eventualmente quando esse erro aparecia eu tratava ele dentro de um try-catch e re-executava a ação que tinha dado erro, mas isso é um pouco ineficiente.
Pesquisando um pouco sobre o assunto achei essa alternativa que usa o FluentWait. Acho que seria interessante implementar isso para aguardar o elemento.
Wait wait = new FluentWait( driver )
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring( StaleElementReferenceException.class ) ;
Vejam o resto do código no post: http://thegreenoak.blogspot.com.br/2013/03/getting-around-webdriver.html
Failed to run story stories/acfisc/cadastro/distribuicao/cancelamento.storyConverted
org.openqa.selenium.StaleElementReferenceException: Element not found in the cache - perhaps the page has changed since it was looked up
Command duration or timeout: 40.23 seconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/stale_element_reference.html
Build info: version: '2.33.0', revision: '4ecaf82108b2a6cc6f006aae81961236eba93358', time: '2013-05-22 12:00:17'
System info: os.name: 'Linux', os.arch: 'i386', os.version: '2.6.38-10-generic-pae', java.version: '1.6.0_20'
Session ID: c06d196d-554f-43ae-9668-d5f1a6ae177e
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [{platform=LINUX, acceptSslCerts=true, javascriptEnabled=true, browserName=firefox, rotatable=false, locationContextEnabled=true, version=10.0.5, cssSelectorsEnabled=true, databaseEnabled=true, handlesAlerts=true, nativeEvents=false, webStorageEnabled=true, applicationCacheEnabled=true, takesScreenshot=true}]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:191)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:554)
at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:268)
at org.openqa.selenium.remote.RemoteWebElement.isEnabled(RemoteWebElement.java:142)
at br.gov.frameworkdemoiselle.behave.runner.webdriver.ui.WebBase.verifyState(WebBase.java:197)
at br.gov.frameworkdemoiselle.behave.runner.webdriver.ui.WebBase.waitElement(WebBase.java:216)
at br.gov.frameworkdemoiselle.behave.runner.webdriver.ui.WebButton.click(WebButton.java:10)
at br.gov.frameworkdemoiselle.behave.parser.jbehave.CommonSteps.clickButton(CommonSteps.java:121)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jbehave.core.steps.StepCreator$ParameterisedStep.perform(StepCreator.java:550)
at org.jbehave.core.embedder.StoryRunner$FineSoFar.run(StoryRunner.java:499)
at org.jbehave.core.embedder.StoryRunner.runStepsWhileKeepingState(StoryRunner.java:479)
at org.jbehave.core.embedder.StoryRunner.runScenarioSteps(StoryRunner.java:443)
at org.jbehave.core.embedder.StoryRunner.runCancellable(StoryRunner.java:305)
at org.jbehave.core.embedder.StoryRunner.run(StoryRunner.java:219)
at org.jbehave.core.embedder.StoryRunner.run(StoryRunner.java:180)
at org.jbehave.core.embedder.StoryManager$EnqueuedStory.call(StoryManager.java:229)
at org.jbehave.core.embedder.StoryManager$EnqueuedStory.call(StoryManager.java:201)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
Caused by: org.openqa.selenium.remote.ErrorHandler$UnknownServerException: Element not found in the cache - perhaps the page has changed since it was looked up
The text was updated successfully, but these errors were encountered: