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
功能,因此它在速度较慢的应用程序中可能表现得不直观