2017-01-13 17 views
0

Я пытаюсь выполнить опрос советников по путешествиям. В некоторых отзывах есть ссылка more, в которой отображается весь текст отзыва при нажатии. Однако, когда я имитирую клик, используя Selenium, изменения DOM, которые дают мне Stale Element Exception. Я пытаюсь обойти это, получив DOM снова, но ошибка все еще существует. Где я иду не так?Stale Element Exception Java Selenium

List reviews = driver.findElements(By.className("review")); 
for (int x = 0; x < reviews.size(); x++) { 
    WebElement element = driver.findElements(By.className("review")).get(x); 
    try { 
     if (element.findElements(By.className("expandLink")).size() > 0) 
      if (element.findElement(By.className("expandLink")).findElement(By.className("ulBlueLinks")).getText().startsWith("More")) { 
       element.findElement(By.className("ulBlueLinks")).click(); 
       if (driver.findElements(By.className("ui_overlay")).size() > 0) 
        driver.findElement(By.className("ui_overlay")).findElement(By.className("ui_close_x")).click(); 
      } 
    } catch (Exception e) { 
     System.out.println(e.getMessage()); 
    } 
    while (driver.findElements(By.className("ui_close_x")).size() > 0) 
     driver.findElement(By.className("ui_close_x")).click(); 
    element = driver.findElements(By.className("review")).get(x); 
    String rating = element.findElement(By.className("ui_bubble_rating")).getAttribute("class").split(" ")[1].replaceAll("bubble_", ""); 
    String review = element.findElement(By.className("entry")).getAttribute("innerHTML").replaceAll("<[^>]*>", "").replaceAll("[,\n]", " "); 

ответ

0

я столкнулся то же самое, это происходит из-за проблем иногда с элементами DOM, которые не достижимы с помощью селена вызывает исключение. Я пришел с этим решением, и это сработало для меня.

http://darrellgrainger.blogspot.in/2012/06/staleelementexception.html

+0

Эй, спасибо за вашу помощь. Однако ошибка происходит не из-за щелчка, а из следующих операторов после щелчка, утверждения 'String rating' ... onwards. –

0

Рассматривали ли вы с помощью аннотации @FindBy для объявления WebElements? Используя эту аннотацию, каждый раз, когда вы вызываете WebElement, драйвер ищет DOM для этого WebElement.

Эта методология означает, что вам нужно только объявить каждый элемент один раз и сохранить ссылку на WebElement. Он также позволяет вам использовать шаблон объекта страницы, который даст вам четкое разделение между страницей и тестовой логикой.

Здесь происходит запись на него:

https://www.toptal.com/selenium/test-automation-in-selenium-using-page-object-model-and-page-factory