2011-12-16 12 views
5

Używając selenu 2, czy istnieje sposób na sprawdzenie, czy element jest nieaktualny?Sprawdź, czy nieświeży element używa selenu 2?

Załóżmy, że inicjuję przejście z jednej strony na drugą (A -> B). Następnie wybieram element X i testuję go. Przypuśćmy, że element X istnieje zarówno na A, jak i naB.

Okresowo X jest wybierany z A przed przejściem strony i nie jest testowany, dopóki nie przejdzie do B, podnosząc wyjątek StaleElementReferenceException. Jest to łatwe do sprawdzenia tego warunku:

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() 

Ale wolałbym zrobić:

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 

Odpowiedz

1

Nie wiem, w jakim języku używasz tam, ale podstawowa idea trzeba w celu rozwiązania jest to:

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 

UWAGA: Oczywiście większość ludzi nie robi tego w ten sposób. W większości przypadków ludzie używają klasy ExpectedConditions, ale w przypadkach, w których wyjątki wymagają lepszej obsługi, to ta metoda (powyżej) może działać lepiej.

0

W 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 

Kod powyżej tłumaczenie Ruby sposobu stalenessOf dostarczonych przez ExpectedConditions. Podobny kod może być napisany w Pythonie lub dowolnym innym języku obsługiwanym przez Selenium, a następnie wywoływany z bloku WebDriverWait, aby poczekać, aż element stanie się nieaktualny.

Powiązane problemy