2010-02-03 40 views
5

Chúng tôi đang chạy Webrat với Selenium2.0 aka WebDriver trong ứng dụng của chúng tôi.WebRat + Selenium WebDriver: chờ ajax hoàn thành

Trang xử lý WebDriver tải lại rất tốt và không bắt đầu các bước tiếp theo nếu trình duyệt tải lại toàn bộ trang. Vấn đề là cơ chế này không hoạt động với các yêu cầu Ajax. WebDriver không thực hiện bất kỳ việc nhàn rỗi nào khi có một số sau khi bấm() hoặc thay đổi().

Có ai có thể đề xuất cách làm cho trình duyệt web không hoạt động cho đến khi kết thúc tất cả yêu cầu ajax trên trang không?

Trả lời

3

Chúng tôi đã kết thúc viết một lớp trên selenium xử lý trường hợp này bằng cách gói các cuộc gọi trong một vòng lặp tùy chọn. Vì vậy, khi bạn muốn làm:

@browser.click "#my_button_id" 

nó sẽ làm điều gì đó tương tự như những gì AutomatedTester gợi ý ở trên:

class Browser 
    def click(locator) 
    wait_for_element(locator, :timeout => PAGE_EVENT_TIMEOUT) 
    @selenium.click(locator) 
    end 

    def wait_for_element(locator, options) 
    timeout = options[:timeout] || PAGE_LOAD_TIMEOUT 
    selenium_locator = locator.clone 
    expression = <<EOF 
     var element; 
     try { 
     element = selenium.browserbot.findElement('#{selenium_locator}'); 
     } catch(e) { 
     element = null; 
     }; 
     element != null; 
EOF 
    begin 
     selenium.wait_for_condition(expression, timeout) 
    rescue ::Selenium::SeleniumException 
     raise "Couldn't find element with locator '#{locator}' on the page: #{$!}.\nThe locator passed to selenium was '#{selenium_locator}'" 
    end 
    end 
end 

các wrapper cũng đã làm những thứ khác, như cho phép để tìm kiếm theo nhãn nút/input vv (Vì vậy, trình bao bọc không chỉ tồn tại cho các vấn đề về thời gian, đây chỉ là một trong những thứ chúng tôi đặt vào đó.)

1

Xin lỗi Ruby của tôi nhưng những gì bạn cần làm là cố gắng tìm đối tượng và nếu nó không có chỉ cần chờ đợi cho nó trở lại. Có gì mã dưới đây nên làm là chờ đợi vòng mỗi giây trong một phút cố gắng để xem nếu người lái xe có thể tìm thấy các phần tử với ID idOfElement và sau đó nếu nó có thể không cần ném một lỗi

assert !60.times{ break if (driver.find_element(:id, "idOfElement) rescue false); sleep 1 } 
+0

Có, điều đó sẽ hiệu quả nhưng bạn phải chỉ định bạn còn chờ gì nữa trong mỗi yêu cầu Ajax . Tôi tin rằng nên có một cách tốt hơn. –

0

Một mtd riêng (wrapper) để kiểm tra các yếu tố với một chờ đợi sẽ giúp đỡ.

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