0

여기 상황이 있습니다.StaleElementReference 예외 디버깅 - Selenium WebDriver

나는 editNewUser() 함수를 가지고있다.

public void editNewUser() throws Exception 
    { 
     driver.findElement(adminModuleDD).click(); 
     wait.until(ExpectedConditions.visibilityOfElementLocated(searchRes)); 
     List<WebElement> elements = wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(uNames)); 
     for(WebElement el : elements) 
     { 
      if(el.getText().equals(UserName)) 
      { 
       el.click(); 
       wait.until(ExpectedConditions.visibilityOfElementLocated(editUserHeading)); 
       driver.findElement(editUser).click(); 
       WebElement status_Dropdown = driver.findElement(By.xpath("//select[@id='systemUser_status']")); 
       Select status = new Select(status_Dropdown); 
       status.selectByVisibleText("Enabled"); 
      } 
     } 
    } 

UserName은 사용자 생성 중에 다른 함수에서 값을 얻는 공용 문자열 변수입니다.

이 스크립트에서는 사용자 목록이 들어있는 페이지로 이동합니다. 목록 '요소'에 모든 사용자 이름을 저장 한 다음 텍스트가 사용자 이름과 일치하는 목록의 각 요소를 반복합니다.

이제 내 test_run 스크립트에서 editNewUser()를 호출하는 다른 메소드가 있습니다.

일이 발생하면이 메소드는 if 블록에서 다음 명령을 실행합니다.

if(el.getText().equals(UserName)) 
    { 
     el.click(); 
     wait.until(ExpectedConditions.visibilityOfElementLocated(editUserHeading)); 
     driver.findElement(editUser).click(); 
     WebElement status_Dropdown = driver.findElement(By.xpath("//select[@id='systemUser_status']")); 
     Select status = new Select(status_Dropdown); 
     status.selectByVisibleText("Enabled"); 
    } 

그러나 빨리 다음 메서드가 호출 될 때, 그것은 실행을 중지하고 org.openqa.selenium.StaleElementReferenceException: Element not found in the cache - perhaps the page has changed since it was looked up

스택 추적이 라인 if(el.getText().equals(UserName))을 의미 던졌습니다.

블록 내부의 명령이 실행되지만이 예외가 발생하는 이유는 무엇인지 말해 줄 수 있습니까?

+0

el.getText(). equals (UserName) 조건 true 목록에서 나머지 요소의 위치가 변경되거나 페이지가 변경되어 셀렌 캐시에서 예외로 발견되지 않을 수 있습니다. 발생했습니다 .. 당신이 이것을 달성하는 경우 조건이 true이면 루프를 깨야합니다. –

답변

0

오류 메시지가 문제를 알려줍니다. for 루프의 첫 번째 "el"을 편집하면 페이지가 변경되고 페이지가 업데이트되므로 Selenium은 "elements"목록의 나머지 요소를 추적하지 못합니다.

반복 할 요소를 추적하려면 다른 방법을 찾아야합니다. 이전에 사용한 기술은 아이템을 나타내는 사용자 정의 객체를 작성하는 것입니다. 아마도 사용자의 경우 "사용자"일 것입니다. 그 객체는 똑똑해서 페이지에서 다시 찾을 수 있습니다.

+0

작은 예제 시나리오와 그 작동을 알려주시겠습니까? – Uziii

+0

코드가 객체 지향 방식으로 작성되고 페이지 객체 모델을 사용하는 경우는 간단합니다. 새 사용자가 나열된 페이지에는 "사용자"개체의 목록을 반환하는 메서드가 있습니다. 각 "사용자"개체는 고유 한 위치 지정자 (아마도 ID 번호)를 사용하여 사용자 개체를 인식합니다. "사용자"클래스에는 해당 사용자의 앵커를 찾는 방법이 있습니다 ... 부모 div 또는 페이지의 사용자 레코드를 래핑하는 항목. 모든 방법은 먼저 앵커를 찾는 것으로 시작합니다. –