Как Selenium webdriver может решить, является ли это устаревшим элементом на одной странице или новым элементом на другой странице?

Я столкнулся с этой странной ситуацией.

  1. Я сначала на странице 1, на которой есть элемент с идентификатором «abc», я использую «abc», чтобы найти webElement и получить его текстовое значение.

  2. Я нажимаю ссылку на странице 1, она переводит меня на страницу 2

  3. На странице 2 также есть элемент с идентификатором «abc», когда я пытаюсь использовать «abc», чтобы найти элемент и получить его текстовое значение, webdriver выдает мне «исключение устаревшего элемента, элемент не прикреплен к DOM и т. Д.»

Я использую Google, чтобы перейти на эту страницу, http://docs.seleniumhq.org/exceptions/stale_element_reference.jsp. В нем объясняется, что «обновлена ​​ли страница, частью которой был элемент, или пользователь перешел на другую страницу ... у драйвера нет способа определить, действительно ли замены соответствуют ожидаемым»

Итак, как решить такой вопрос? Теоретически у webdriver нет возможности узнать, что эти элементы находятся на двух разных страницах.

Стоит заметить, что если я вставлю жестко запрограммированную задержку (засыпание потока и т. Д.) Между переключением страниц, устаревшая проблема не появится.

Спасибо,


person user1559625    schedule 19.05.2016    source источник
comment
будет полезно, если вы опубликуете свой образец кода для вышеуказанного   -  person eduliant    schedule 19.05.2016
comment
также ваш вопрос немного сбивает с толку, ищете ли вы, как избавиться от исключения устаревшего элемента, или вы хотите знать, как селен узнает, что у нас есть две разные страницы с двумя разными элементами с той же стратегией локатора.   -  person eduliant    schedule 19.05.2016
comment
вы могли бы использовать статическую переменную [webelement] в методе, который вы использовали бы для поиска элемента ...   -  person TechDog    schedule 19.05.2016


Ответы (2)


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

// Case one - when you are simply calling firstPageText two time
// then before calling it on the next page please re identify it 
// to get rid of stale element exception.

   String firstPageText =  driver.findElement(By.id("abc")).getText();
   System.out.println("Text on the first page is : " + firstPageText);

   driver.findElement(By.linkText("to second page ")).click();

   String secondPageText =  driver.findElement(By.id("abc")).getText();
   System.out.println("Text on the Second page is : " + secondPageText );

также, если вы создали метод, который выполняет описанный выше сценарий, то, чтобы избежать указанной выше ошибки, создайте два отдельных метода: один для страницы 1 и один для страницы два, каждый из которых имеет свою индивидуальную стратегию идентификации.

person eduliant    schedule 19.05.2016
comment
firstPageText - это строка, полученная из элемента. как это можно потерять в вашем примере? - person user1559625; 19.05.2016

Устаревший элемент - это элемент, который был удален со страницы. Итак, в вашем случае вы, вероятно, получаете элемент непосредственно перед обновлением документа. Чтобы избежать этой ситуации, вы можете сначала подождать, пока элемент не станет устаревшим, прежде чем получать новый элемент:

// get the element
WebElement element = driver.findElement(By.id("abc"));

// trigger the update of the document
driver.findElement(By.id("my-button")).click();

// wait for the element to become stale
WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.stalenessOf(element));

// get the new element
WebElement element = driver.findElement(By.id("abc"));
person Florent B.    schedule 19.05.2016
comment
Б. В моем случае страница загружается медленно, поэтому я не думаю, что это необходимо (и у меня нет другого элемента, который можно щелкнуть, чтобы запустить обновление документа). Так что я постараюсь использовать ваш способ ждать ТОЛЬКО устаревания. Спасибо. - person user1559625; 20.05.2016
comment
Кстати, мой предыдущий опыт показывает, что использование sth вроде wait.until.element.clickable всегда решает проблему устаревания. Из вашего образца кода я думаю, что, возможно, wait.clickable использует пробный щелчок внутри. Однако на этот раз я пытался ПОЛУЧИТЬ ЗНАЧЕНИЕ элемента, и я БЫЛ использовал wait.until.element.present, и он не запускал обновление документа. Не в этом ли причина? - person user1559625; 20.05.2016
comment
element_to_be_clickable проверяет element.is_enabled() и element.is_displayed(). В этом примере рассматривается случай, когда элемент в какой-то момент удаляется и заменяется другой ссылкой. В любом случае, не имея вашего кода и не зная поведения страницы, я ничего не могу сделать. - person Florent B.; 20.05.2016