1

我对 Capybara 中的框架有疑问。我切换到一帧并单击足球,然后单击该类别的所有链接,但仅单击了 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它,它就会正常运行。

4

1 回答 1

1

Selenium::WebDriver::Error::StaleElementReferenceError意味着当前页面上有一个 DOM 元素与用于查找您正在调用方法的 Selenium 元素对象的选择器匹配,但它不是同一个 DOM 元素。

在您的情况下,您似乎正在与一组页面共有的一些导航链接进行交互。例如,如果page.all('div#MarketTbl span.LMenuLeft a')返回 3 个链接,并且这 3 个链接存在于每个链接到达的所有页面上,如果您没有sleep在循环中,则前两个链接可能在页面实际更改之前被点击。

sleep循环中,当a.click调用第二个时,a在第一页上找到了对象,但它所代表的链接现在是一个不同的物理 DOM 节点,因为第二页已经有时间加载。

我会尝试取出循环并单独查找并单击每个链接。

另请注意,#all它不使用 Capybara 的wait_until功能,因此它可能会在缓慢的应用程序中表现得不直观。

于 2012-08-04T13:09:12.013 回答