2015-10-20 3 views
-1

я не понимаю концепцию:, где мне нужно добавить «wait.ignoring» в «ExpectedConditions.visibilityOfElementLocated»

wait.ignoring(StaleElementReferenceException.class).until 
(ExpectedConditions.visibilityOfElementLocated(By.xpath("bla bla"))); 

I другими словами, почему мне нужно, чтобы эта часть:

ignoring(StaleElementReferenceException.class) 

в то время как

ExpectedConditions.visibilityOfElementLocated 

ждет, пока элемент виден, так что она не устарела.

+0

В последнее время вы задаете много вопросов, которые можно было бы понять, если посмотреть на документацию. Пожалуйста, задайте свой вопрос и потратите некоторое время на чтение, прежде чем задавать такие основные вопросы. – JeffC

ответ

1

Общий эффект говоря экземпляр FluentWait (который является то, что WebDriverWait основан на) игнорировать исключения в том, что если произойдет такое исключение, когда он опрашивает DOM, он будет продолжать опрос, а не пусть исключение просачивается вверх.

В конкретном случае ExpectedConditions.visibilityOfElementLocated нет никакой пользы явно игнорируя StaleElementReferenceException потому ExpectedConditions.visibilityOfElementLocatedуже игнорирует. В нем есть explicit try... catch... block, который заставит его вернуть null, если элемент устарел. Я не знаю, не были ли у старых версий Selenium этот блок try... catch.... Возможно, для некоторых более ранних версий Selenium было необходимо явно указать FluentWait, чтобы игнорировать это исключение.

ожидает, пока элемент будет виден, чтобы он не был устаревшим.

Возможно, для ExpectedConditions.visibilityOfElementLocated необходимо иметь дело с прочным элементом. Он выполняет свой тест в два этапа:

  1. Получить WebElement, соответствующий локатор передается пользователю.

  2. Звоните .isDisplayed() на этот элемент.

Между этих двух шагов, это возможно, для DOM, чтобы быть изменен таким образом, что элемент, приобретенный в первой стадии уже несвежий (== больше в документах нет) к тому времени, второй этап пробеги. Это очень маленькое окно риска, но оно существует и поэтому должно быть обработано.

2

Простыми словами вы можете понять приведенный выше код.

ignoring(StaleElementReferenceException.class) 

Above ignore используется для игнорирования конкретного исключения, которое может произойти во время ожидания. Например, в ожидании элемента, если возникает StaleElementReferenceException, он будет игнорировать исключение и не будет вызывать исключение извне.

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

  1. Элемент был удален полностью.
  2. Элемент больше не прикреплен к DOM.

Stale Element Reference Exception Documentation