각 섹션 아래에 여러 링크가있는 목록이 있습니다. 각 섹션에는 각 섹션 아래의 특정 링크를 클릭하는 데 필요한 동일한 링크가 있습니다. 아래 코드를 작성했지만 실행하면 stale element reference: element is not attached to the page document
오류가 발생합니다.
이것은 내 코드입니다.
public static void main(String[] args) throws InterruptedException
{
WebDriver driver = new ChromeDriver();
driver.navigate().to("url......");
driver.findElement(By.id("Login1_txtEmailID")).sendKeys("hourbank5@....com");
driver.findElement(By.id("Login1_txtPassword")).sendKeys("Testing1*");
driver.findElement(By.id("Login1_btnLogin")).click();
List<WebElement> LeftNavLinks=driver.findElements(By.xpath("//*[@id='sliding-navigation']//a"));
Thread.sleep(1000);
String ben="Benefit Status";
String[] linkTexts = new String[LeftNavLinks.size()];
int i = 0;
for (WebElement e : LeftNavLinks)
{
linkTexts[i] = e.getText();
System.out.print(i+" " + linkTexts[i]+"\n");
if(linkTexts[i].equals(ben))
{
String BenefitStatLi="//*[@id='sliding-navigation']/li[%s]/a";
System.out.print(i+" " + linkTexts[i]+"\n");
driver.findElement(By.xpath(String.format(BenefitStatLi,i))).click();
driver.findElement(By.xpath("//* [@id='divContentHolder']/div[1]/a[1]")).click();
}
i++;
}
}
}
HTML 구조는 아래와 같습니다.
<div id="ucAdminMenu_divMenu">
<ul id="sliding-navigation">
<li class="sliding-element">
<a href=" ">Claims Status</a>
</li>
<li class="sliding-element">
<a href=" ">Eligibility Status</a>
</li>
<li class="sliding-element">
<h3>Section-1</h3>
</li>
<li class="sliding-element">
<a href=" ">Forms and Documents</a>
</li>
<li class="sliding-element">
<a href=" HourBank.aspx?id=002">Hour Bank</a>
</li>
<li class="sliding-element">
<h3>Section-2</h3>
</li>
<li class="sliding-element">
<a href=" ">Benefit Status</a>
</li>
<li class="sliding-element">
<a href=" ">Forms and Documents</a>
</li>
<li class="sliding-element">
<h3>Section-3</h3>
</li>
<li class="sliding-element">
<a href=" ">Forms and Documents</a>
</li>
<li class="sliding-element">
<h3>Testing Fund</h3>
</li>
<li class="sliding-element">
<a href=" ">Benefit Status</a>
</li>
<li class="sliding-element">
<a href=" ">Order ID Card</a>
</li>
</ul>
</div>
오류 추적은 다음과 같습니다.
Exception in thread "main"
org.openqa.selenium.StaleElementReferenceException: stale element
reference: element is not attached to the page document
답변
예외를주는 줄은 무엇입니까 ??
그 이유는 참조한 요소가 DOM 구조에서 제거 되었기 때문입니다.
IEDriver와 함께 작업하면서 같은 문제에 직면했습니다. 그 이유는 내가 참조 한 후 자바 스크립트가 요소를 한 번 더로드했기 때문에 UI에서 올바른 경우에도 내 날짜 참조가 존재하지 않는 개체를 가리 켰습니다. 다음 해결 방법을 사용했습니다.
try {
WebElement date = driver.findElement(By.linkText(Utility.getSheetData(path, 7, 1, 2)));
date.click();
}
catch(org.openqa.selenium.StaleElementReferenceException ex)
{
WebElement date = driver.findElement(By.linkText(Utility.getSheetData(path, 7, 1, 2)));
date.click();
}
같은 것이 당신을 도울 수 있는지보십시오!
답변
이 문제가 발생할 때마다 오류가 발생한 줄 위에 웹 요소를 다시 한 번 정의하십시오 .
예:
WebElement button = driver.findElement(By.xpath("xpath"));
button.click();
//here you do something like update or save
//then you try to use the button WebElement again to click
button.click();
예를 들어 업데이트 작업을 통해 DOM이 변경되었으므로 StaleElementReference
오류가 발생합니다.
해결책:
WebElement button = driver.findElement(By.xpath("xpath"));
button.click();
//here you do something like update or save
//then you define the button element again before you use it
WebElement button1 = driver.findElement(By.xpath("xpath"));
//that new element will point to the same element in the new DOM
button1.click();
답변
이 오류에는 두 가지 일반적인 원인이 있습니다. 요소가 완전히 삭제되었거나 요소가 더 이상 DOM에 연결되지 않았습니다.
귀하의 경우가 아닌지 이미 확인했다면 나와 같은 문제에 직면했을 수 있습니다.
Selenium이 요소를 검색 할 때 페이지가 완전히로드되지 않았기 때문에 DOM의 요소를 찾을 수 없습니다. 이를 해결하기 위해 Selenium이 요소를 클릭 할 수있을 때까지 기다리도록 지시하는 명시 적 대기 조건을 설정할 수 있습니다.
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID, 'someid')))
참조 : https://selenium-python.readthedocs.io/waits.html
답변
이를 처리하기 위해 다음과 같은 클릭 방법을 사용합니다. 그러면 요소를 찾아 클릭합니다. DOM이 찾기와 클릭 사이에 변경되면 다시 시도합니다. 아이디어는 실패하고 즉시 다시 시도하면 두 번째 시도가 성공할 것이라는 것입니다. DOM 변경이 매우 빠르면 작동하지 않습니다.
public boolean retryingFindClick(By by) {
boolean result = false;
int attempts = 0;
while(attempts < 2) {
try {
driver.findElement(by).click();
result = true;
break;
} catch(StaleElementException e) {
}
attempts++;
}
return result;
}
답변
여기서는 조건문 외부에서 for 루프를 사용하고 있습니다.
IF 문의 조건이 충족되면 다른 페이지로 이동할 수 있으므로 for 루프가 한 번 더 반복을 시도하면 다른 페이지에 있기 때문에 부실 요소 오류가 발생합니다.
if 문 끝에 휴식 을 추가 할 수 있습니다 .
답변
클릭하려는 요소를 찾으면 루프를 끊으십시오. 예를 들면 :
List<WebElement> buttons = getButtonElements();
for (WebElement b : buttons) {
if (b.getText().equals("Next"){
b.click();
break;
}
답변
이 코드를 사용하십시오.
public class LinkTest
{
public static void main(String[] args)
{
WebDriver driver = new FirefoxDriver();
driver.navigate().to("file:///C:/Users/vkiran/Desktop/xyz.html");
List<WebElement> alllinks =driver.findElements(By.xpath("//*[@id='sliding-navigation']//a"));
String a[]=new String[alllinks.size()];
for(int i=0;i<alllinks.size();i++)
{
a[i]=alllinks.get(i).getText();
if(a[i].startsWith("B"))
{
System.out.println("clicking on this link::"+driver.findElement(By.linkText(a[i])).getText());
driver.findElement(By.linkText(a[i])).click();
}
else
{
System.out.println("does not starts with B so not clicking");
}
}
}
}