2017-09-07 5 views
0

Je souhaite obtenir le texte de li (second) élément comme ci-dessous. Le code est capable de trouver l'élément mais il lance l'erreur en récupérant le gettext. S'il vous plaît aider.Erreur d'élément périmé lors de l'obtention du texte de l'élément

WebElement element = driver.findElement(By.xpath("//div[contains(@id,'location_group')]/div/ul/li[2]")); 

element.getText(); 

Erreur

référence de l'élément Stale: élément n'est pas joint au document de la page

HTML

<div id=location_group> 
    <div> 
    <ul class="og-tooltip js-og-tooltip" style="display: none; opacity: 100;"> 
     <li class="title_text">Organization Group</li> 
     <li class="value_text" style="background: rgb(204, 136, 136); border: 2px solid red;">Global/Aricent/gemsecure </li> 
     <li>&nbsp;</li> 
     <li class="title_text">Group ID</li> 
     <li class="value_text">gemsecure</li> 
    </ul> 
    </div> 
</div> 
+0

Avez-vous vérifié [Stale élément Exception Référence] (http://docs.seleniumhq.org/exceptions /stale_element_reference.jsp)? En outre, quelle langue et quel navigateur utilisez-vous? –

+0

Copie possible de [Exception StaleElementReference dans PageFactory] (https://stackoverflow.com/questions/44838538/staleelementreference-exception-in-pagefactory) – DebanjanB

Répondre

-1

Parce que cet élément est enveloppé d'un ul qui a display: none Le sélénium ne peut pas interagir avec lui. Options pour essayer:

element.getAttribute("innerHTML"); 

ou vous pouvez utiliser le JavascriptExecutor:

JavascriptExecutor executor = (JavascriptExecutor)driver; 
String text= executor.executeScript("document.document.getElementsByClassName('value_text')[0].innerHTML"); 

Une autre option consiste à utiliser querySelector/querySelectorAll qui a un soutien plus large que getElementsByClassName

+0

Si l'élément n'était pas visible, il n'aurait pas levé une exception d'élément périmé . Cela ne résout pas le problème. En outre, il y a plus d'un élément avec ce nom de classe (et probablement d'autres sur la page). – JeffC

-1

Peut-être que vous avez attendre que l'élément parent soit visible puis interagir avec lui

WebElement elementUL = driver.findElement(By.xpath("//div[contains(@id,'location_group')]/div/ul")); 
WebDriverWait wait=new WebDriverWait(driver, 60); 
wait.until(ExpectedConditions.visibilityOf(elementUL)); 

WebElement element = driver.findElement(By.xpath("//div[contains(@id,'location_group')]/div/ul/li[2]")); 

element.getText(); 
+0

Si l'élément n'était pas visible, il n'aurait pas levé une exception d'élément périmé. Cela ne résout pas le problème. – JeffC

+0

Les éléments sont en cours de chargement et l'élément parent est masqué. C'est pourquoi j'attends. Je ne dis pas, il va jeter l'erreur périmé si l'élément n'est pas visible. – Murthi

+0

Selon OP il est actuellement en train de jeter une exception d'élément périmé. Votre réponse à la question est d'attendre que l'élément soit visible. Alors, comment attendre que l'élément soit visible résout l'exception de l'élément périmé? – JeffC

-1

Placez une explicite attendre WebDriverWait et attendre jusqu'à ce que l'élément soit visible

WebElement ele = driver.findElement(By.xpath("Your locator ")); 
WebDriverWait wait=new WebDriverWait(driver, 25); 
wait.until(ExpectedConditions.visibilityOf(ele)); 

puis getText()

+0

Si l'élément n'était pas visible, il n'aurait pas levé une exception d'élément périmé. Cela ne résout pas le problème. – JeffC

+1

alors S'il vous plaît donner la solution si U knw, soit le résoudre ou corriger mon code – iamsankalp89