2011-12-16 44 views
5

Sử dụng selen 2, có cách nào để kiểm tra xem một phần tử có cũ không?Kiểm tra phần tử cũ bằng selenium 2?

Giả sử tôi bắt đầu chuyển đổi từ trang này sang trang khác (A -> B). Sau đó tôi chọn phần tử X và kiểm tra nó. Giả sử X yếu tố tồn tại trên cả A và B.

Không liên tục, X được chọn từ A trước khi chuyển trang xảy ra và không được kiểm tra cho đến sau khi chuyển sang B, tăng StaleElementReferenceException. Thật dễ dàng để kiểm tra các điều kiện này:

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

Nhưng tôi thà làm:

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 

Trả lời

1

Tôi không biết những gì ngôn ngữ mà bạn đang sử dụng có nhưng ý tưởng cơ bản bạn cần để giải quyết này là:

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 

LƯU Ý: Tất nhiên, hầu hết mọi người không làm theo cách này. Hầu hết thời gian mọi người sử dụng lớp ExpectedConditions nhưng, trong trường hợp ngoại lệ cần phải được xử lý tốt hơn phương pháp này (tôi nêu ở trên) có thể hoạt động tốt hơn.

0

Trong 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 

Đoạn mã trên là bản dịch của Ruby của phương pháp stalenessOf cung cấp bởi ExpectedConditions. Mã tương tự có thể được viết bằng Python hoặc bất kỳ ngôn ngữ nào khác mà Selenium hỗ trợ, và sau đó được gọi từ khối WebDriverWait để đợi cho đến khi phần tử trở nên cũ.

Các vấn đề liên quan