我正在与一个使用SignalR轮询的JavaScript密集型网站进行交互。这通常会导致Watir Web驱动程序在加载页面后超时。
我通过附加以下命令获得了部分成功:driver.execute_script '$.connection.hub.stop();'
到每个页面导航指令,如转到或单击。
然而,这并不是在每个实例中都有效,因为我认为轮询有时在页面加载后才开始。在某些情况下,轮询也是通过选择单选按钮或复选框来触发的。
除了必须使用Timeout并在每次失败后重新访问页面之外,是否有可靠的方法来处理轮询?
我想知道你是否对你想要实现的目标感到困惑。我想我应该为操作创建一个处理程序,将代码传递给它们进行尝试,处理特定的异常并重试。
def action_handler(*arg, &code)
begin
code.call arg if block_given?
rescue Some::Specific, Error::Classes => e
@driver.execute_script '$.connection.hub.stop();'
retry
end
end
# ...
def whatever
# ...
action_handler { @browser.link(:id => 'obj').when_present.click }
# ...
end
也许还有更好的JavaScript方法可以停止轮询——也许是return window.stop();
?还是throw new Error("BOOM!");
?还是$.connection.hub.abort()
?(一些读数。)
为了让你的代码变得干燥,你可以在Watir Webdriver ymmv中进行monkey补丁Timer或Element之类的东西。