2

使用 ruby​​ 的 Watir gem,我试图单击一个打开 javascript 弹出窗口的按钮,然后在弹出窗口上单击“确定”,我似乎无法做到这一点。按钮在一个框架中。我已经广泛搜索并阅读了有关 javascript 弹出窗口的 Watir wiki 条目,但没有任何效果。
我认为这是因为 execute_script 和 click_no_wait 没有按预期工作。
例如,以下命令:

    @browser.execute_script('window.alert = function() {}')
    @browser.execute_script('alert("hello")')

创建一个显示“你好”的 javascript 弹出窗口,而不是不做任何事情的预期行为。
命令:

    @browser.button(:value, 'Submit').click

单击创建 javascript 弹出窗口的按钮。然后脚本挂起,直到我在弹出窗口上手动单击“确定”。
命令:

    @browser.button(:value, 'Submit').click_no_wait

不单击按钮(或者它确实单击了按钮并且不触发 onclick 事件)。
我也试过:

    Timeout::timeout(1) { @browser.button(:value, 'Submit').click }

    Thread.new { @browser.button(:value, 'Submit').click }

但是 Timeout 永远不会引发异常,导致 ruby​​ 挂起,直到我在弹出窗口上手动单击“确定”,当我在新线程中运行它时,Watir 不会单击。

有人可以提供帮助或提供解决方案吗?

编辑:问题是在@browser.button.click 之后,脚本挂起直到弹出窗口关闭。@browser.alert.ok 成功关闭了弹出窗口,但是在单击按钮后脚本无法执行@browser.alert.ok,因为它一直挂起直到弹出窗口关闭。这个catch-22应该通过click_no_wait解决,但是click_no_wait没有点击。

系统信息:
Windows 7 Enterprise 64 Bit
Internet Explorer Version 9.0.12
watir-4.0.2-x86-mingw32
ruby​​ 1.9.3p286 (2012-10-12) [i386-mingw32]

4

1 回答 1

1

有一个警报 api(watir-classicwatir-webdriver),您可以使用它与 j​​avascript 弹出窗口进行交互。

尝试使用以下方法关闭弹出窗口:

@browser.alert.ok

更新 - 解决方法:

这似乎是对框架中的元素使用 Element#click_no_wait 的错误。我已经更新了第 45 期并将尝试提交补丁。

同时,在脚本开头添加以下猴子补丁应该可以解决问题(即 click_no_wait 不应等待):

require 'watir-classic'

Watir::IE.new(true)
module Watir
    class Frame
        def attach_command
            tag_name = @specifiers[:tag_name].join("' << '")
            @container.page_container.attach_command + ".frame(:tag_name => Array.new << '#{tag_name}', :unique_number => #{unique_number})"
        end
    end
end
于 2012-12-17T16:56:42.313 回答