我在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
,它就会正常运行。
答案 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
功能,因此对于缓慢的应用程序,它的行为可能会不直观。