2012-08-03 52 views
1

我在水豚中有幀問題。我切換到一個框架,然後點擊足球,然後在該類別的所有鏈接上,但只有2個鏈接被點擊,然後錯誤引發消息,該元素不在當前幀。元素屬於與當前元素不同的幀 - 切換到其包含的幀以使用它

require 'rubygems' 
require 'capybara' 
require 'capybara/dsl' 

Capybara.run_server = false 
Capybara.current_driver = :selenium 
Capybara.default_wait_time = 5 
Capybara.app_host = 'http://sports.sbobet.com' 

module MyCapybaraTest 
    class Test 
    include Capybara::DSL 
    def test 
     visit('/') 
     page.driver.browser.switch_to.frame 'leftFrame' 

     wait_until {page.find('table span.SportName').visible?} 
     page.all('table span.SportName').each do |span| 
     if (span.text == 'Football') 
      span.click 
      page.all('div#MarketTbl span.LMenuLeft a').each do |a| 
      puts a[:href] 
      a.click 
      sleep 3 
      end 
     end 
     end 

    end 
    end 
end 

t = MyCapybaraTest::Test.new 
t.test 

詳細的錯誤是: https://gist.github.com/3252149

我不知道什麼是錯誤的,因爲如果我刪除sleep 3然後它運行正常。

回答

1

Selenium::WebDriver::Error::StaleElementReferenceError表示在當前頁面上有一個DOM元素,它與用於查找要調用方法的Selenium元素對象的選擇器相匹配,但它不是同一個DOM元素。

就你而言,它看起來像你正在與一組頁面通用的一些導航鏈接進行交互。例如,如果page.all('div#MarketTbl span.LMenuLeft a')返回3個鏈接,並且這些鏈接中的每個鏈接到達的所有頁面上都存在這3個鏈接,如果循環中沒有sleep,則可能在頁面實際更改之前單擊前兩個鏈接。

與環中的sleep,當第二a.click被調用時,a對象是在第一頁上找到,但它代表的聯繫,現在是不同的,物理的DOM節點,因爲第二頁有時間來加載。

我會嘗試將環路取出並單獨找到並單擊每個鏈接。

另外請注意,#all不使用水豚的wait_until功能,所以它可以在緩慢的應用程序行爲不直觀。

相關問題