元素属于与当前帧不同的帧 - 切换到其包含的帧以使用它

时间:2012-08-03 22:31:11

标签: ruby capybara

我在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,它就会正常运行。

1 个答案:

答案 0 :(得分: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功能,因此对于缓慢的应用程序,它的行为可能会不直观。