将 Watir-Webdriver Firefox 与 JavaScript SignalR 轮询结合使用
Using Watir-Webdriver Firefox With JavaScript SignalR Polling
我正在与一个使用 SignalR 轮询的 JavaScript-heavy 网站进行交互。这通常会导致 Watir-Webdriver 在加载页面后超时。
我通过附加命令取得了部分成功:
driver.execute_script '$.connection.hub.stop();'
每个页面导航指令,如转到或单击。
然而,这并非在所有情况下都有效,因为我认为轮询有时会在页面加载 后才开始。在某些情况下,也可以通过选择单选按钮或复选框来触发轮询。
除了必须使用超时并在每次失败后重新访问页面之外,是否有处理轮询的可靠方法?
我想知道你是否对你想要完成的事情的具体细节感到困惑。我想我会为操作创建一个处理程序,将您的代码传递给它们来尝试,处理特定的异常并重试。
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()
? (Some reading.)
为了使您的代码变干,您可以在 Watir-Webdriver 中使用 monkey-patching Timer 或 Element 或类似的东西,ymmv。
我正在与一个使用 SignalR 轮询的 JavaScript-heavy 网站进行交互。这通常会导致 Watir-Webdriver 在加载页面后超时。
我通过附加命令取得了部分成功:
driver.execute_script '$.connection.hub.stop();'
每个页面导航指令,如转到或单击。
然而,这并非在所有情况下都有效,因为我认为轮询有时会在页面加载 后才开始。在某些情况下,也可以通过选择单选按钮或复选框来触发轮询。
除了必须使用超时并在每次失败后重新访问页面之外,是否有处理轮询的可靠方法?
我想知道你是否对你想要完成的事情的具体细节感到困惑。我想我会为操作创建一个处理程序,将您的代码传递给它们来尝试,处理特定的异常并重试。
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()
? (Some reading.)
为了使您的代码变干,您可以在 Watir-Webdriver 中使用 monkey-patching Timer 或 Element 或类似的东西,ymmv。