2016-03-08 2 views
1

Я исследовал эту ошибку на некоторое время и попробовал много вещей, и ничего, кажется, работают ...Селена: StaleElementReferenceException

 while(!driver.findElements(By.className("next")).isEmpty()) { 
      //elements = driver.findElements(By.xpath("//a[@class='name']")); 
      elements = findDynamicElements("//a[@class='name']"); 
      for (WebElement e : elements) { 
       userName = e.getText(); //<--EXCEPTION HERE 
       check_visitor_profile(userName);//<--WE LEAVE THE PAGE HERE 
       Thread.sleep(3000); //<--NO TRY/CATCH BLOCK FOR READABILITY 
       driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
       elements = findDynamicElements("//a[@class='name']"); 

      } 
      driver.findElement(By.xpath("VisitsNext")).click(); 
     }  



protected List<WebElement> findDynamicElements(String path) { 
     List<WebElement> result; 
     String xPath = path; 
     new WebDriverWait(driver, 25).until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath(xPath))); 
     //new WebDriverWait(driver, 25).until(elementIdentified(By.id(path))); 

     try { 
      result = driver.findElements(By.xpath(xPath)); 
      return result; 
     } 
     catch(WebDriverException e) { 
      return null; 
     } 
    ); 
    } 

Мой код крэпс на первую линию для цикла, где имя_пользователя . Я видел на этом форуме, что вы должны использовать 'presenceOfElementLocated' и явно ждать возвращения элемента, но это тоже не работает. Я использовал 'presenceOfAllElementsLocatedBy' для списка, но у меня есть метод, который использует 'presenceOfElementLocated', который тоже не работает.

Я знаю вещи, как Thread.sleep и implicitlyWait линии, вероятно, нет необходимости в данный момент, но я буквально попробовал все, и это не работает ... происходит

ошибка, потому что, когда я называю " check_visitor_profile 'он оставляет страницу - когда он возвращается, элементы неуместны, поэтому я должен их снова найти. Что я делаю, но это все еще исключает.

Любые идеи?

Спасибо.

ответ

1

Проблема может возникнуть из-за изменения elements в середине цикла. Это вызовет проблемы даже без StaleElementReferenceException. Используйте for петли вместо for each петли

elements = findDynamicElements("//a[@class='name']"); 
int size = elements.size(); 
for (int i = 0 ; i < size ; ++i) { 
    elements = findDynamicElements("//a[@class='name']"); 
    userName = elements.get(i).getText(); 
    check_visitor_profile(userName); 
} 
+0

Это был ответ, который я искал - Спасибо. – MatTaNg

0

Handle исключения явно как элемент больше не прикрепленные к DOM или изменился в тот момент, когда вы звоните «check_visitor_profile»

Смотрите ссылку ниже могущества помочь

  catch(StateElementException e){ 
      System.out.println("StaleElement dealt with since you successfully left page "); 
       } 

http://docs.seleniumhq.org/exceptions/stale_element_reference.jsp

Смежные вопросы