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

Ruby 元素属于与当前一个不同的帧-切换到其包含的帧以使用它,ruby,capybara,Ruby,Capybara,我对水豚的框架有问题。我切换到一个帧,然后单击足球,然后单击该类别上的所有链接,但只单击了两个链接,之后错误会提示此元素不在当前帧上 require 'rubygems' require 'capybara' require 'capybara/dsl' Capybara.run_server = false Capybara.current_driver = :selenium Capybara.default_wait_time = 5 Capybara.app_host = 'http:

我对水豚的框架有问题。我切换到一个帧,然后单击足球,然后单击该类别上的所有链接,但只单击了两个链接,之后错误会提示此元素不在当前帧上

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
详细错误是:


我不知道哪里出了问题,因为如果我删除
sleep3
,它就会正常运行。

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

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

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

我会尝试将循环取出,分别查找并单击每个链接


还要注意的是,
#all
不使用水豚的
等待功能,因此,对于速度较慢的应用程序,它的行为可能不直观。

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

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

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

我会尝试将循环取出,分别查找并单击每个链接

还要注意的是,
#all
并没有使用Capybara的
wait_until
功能,因此它在速度较慢的应用程序中可能表现得不直观