Проверить на несвежий элемент, используя селен 2? - PullRequest
5 голосов
/ 17 декабря 2011

Используя селен 2, есть ли способ проверить, устарел ли элемент?

Предположим, я инициирую переход с одной страницы на другую (A -> B). Затем я выбираю элемент X и проверяю его. Предположим, что элемент X существует как на A, так и на B.

Периодически X выбирается из A до того, как произойдет переход страницы, и не проверяется до перехода к B, вызывающего исключение StaleElementReferenceException Это легко проверить для этого условия:

try:
  visit_B()
  element = driver.find_element_by_id('X')  # Whoops, we're still on A
  element.click() 
except StaleElementReferenceException:
  element = driver.find_element_by_id('X')  # Now we're on B
  element.click()

Но я бы лучше сделал:

element = driver.find_element_by_id('X') # Get the elment on A
visit_B()
WebDriverWait(element, 2).until(lambda element: is_stale(element))
element = driver.find_element_by_id('X') # Get element on B

Ответы [ 2 ]

1 голос
/ 15 марта 2013

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

boolean found = false
set implicit wait to 5 seconds
loop while not found 
try
  element.click()
  found = true
catch StaleElementReferenceException
  print message
  found = false
  wait a few seconds
end loop
set implicit wait back to default

ПРИМЕЧАНИЕ: Конечно, большинство людей не делают этого таким образом,В большинстве случаев люди используют класс ExpectedConditions, но в тех случаях, когда необходимо обрабатывать исключения, этот метод (я утверждаю выше) может работать лучше.

0 голосов
/ 28 мая 2015

В Ruby

$default_implicit_wait_timeout = 10 #seconds

def element_stale?(element)
  stale = nil  # scope a boolean to return the staleness

  # set implicit wait to zero so the method does not slow your script
  $driver.manage.timeouts.implicit_wait = 0

  begin ## 'begin' is Ruby's try
    element.click
    stale = false
  rescue Selenium::WebDriver::Error::StaleElementReferenceError
    stale = true
  end

  # reset the implicit wait timeout to its previous value
  $driver.manage.timeouts.implicit_wait = $default_implicit_wait_timeout

  return stale
end

Приведенный выше код представляет собой Ruby-перевод метода stalenessOf, предоставляемого ExpectedConditions .Аналогичный код может быть написан на Python или любом другом языке, поддерживаемом Selenium, а затем вызван из блока WebDriverWait, чтобы дождаться, пока элемент не устареет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...