Javascript 瓦蒂尔:如何执行通过iframe的onload调用的JS函数?

Javascript 瓦蒂尔:如何执行通过iframe的onload调用的JS函数?,javascript,html,ruby,iframe,watir,Javascript,Html,Ruby,Iframe,Watir,目标是让Watir单击一个纯粹通过JS运行的按钮 主页面有一个iframe,看起来类似于: <input type="button" id="click_me"> form1.html调用一个JS函数,函数体中的onload类似于: 然后向我显示一个按钮,其中包含我可以使用的值/id。我只是不知道如何通过iframe和onload单击该按钮 我尝试过使用frame()和fire_event()并直接将其寻源,但没有成功。我不熟悉Watir和ruby,所以也许他们的方法更简单?您

目标是让Watir单击一个纯粹通过JS运行的按钮

主页面有一个iframe,看起来类似于:

<input type="button" id="click_me">

form1.html调用一个JS函数,函数体中的onload类似于:

然后向我显示一个按钮,其中包含我可以使用的值/id。我只是不知道如何通过iframe和onload单击该按钮


我尝试过使用frame()和fire_event()并直接将其寻源,但没有成功。我不熟悉Watir和ruby,所以也许他们的方法更简单?

您想从iframe访问主窗口吗?如果是这样,请尝试在JavaScript中使用
top
对象


top.document.getElementById(“您的按钮”).doSomething()

Watir不在乎按钮是否由JavaScript创建。如果它显示在页面上,它可以单击它

使用Firebug(或类似工具)检查按钮,其外观应与以下类似:

<input type="button" id="click_me">
由于按钮位于框架中,因此必须指定它:

browser.frame(:id => "uploadfile").button(:id => "click_me").click

为了适应onload,您可能需要让脚本休眠一秒钟左右,以便让客户端代码有时间完成它的工作。或使用上描述的某些技术等待按钮存在

您不需要触发“onload”事件,据我所知,浏览器本身会这样做,因为它为框架加载HTML,唯一的细节是在尝试使用由该代码创建的任何元素之前,为客户端代码提供足够的时间来完成它的工作

否则,寻址按钮的唯一“诀窍”就是在DOM中正确定位和标识它。如果按钮是在iframe中创建的,那么正如Zeljko的响应中所指出的,您将需要使用一些类似于

browser.frame(:id => "uploadfile").button(:id => "click_me").click

我建议使用IRB作为开发脚本的方法,因为您可以一次测试一个命令,看看哪个命令有效。这很像是能够在调试器中单步调试内容,只是稍微多了一点手动操作。

这就是我最初采用的路径。问题在于,瓦蒂尔似乎无法通过画面直接看到按钮。iframe指向另一个文件,该文件在与表单一起加载时触发JS函数,然后表单指向按钮。Firebug在定位按钮及其id方面没有问题,但我似乎要经历几个层次。你可能会把“层次”和“时间”混淆起来,请参见我的答案;-)谢谢你,恰克。我开始使用IRB单独测试这些命令,并看到它确实正在加载框架的HTML。所以我使用了类似browser.frame(:id,“uploadfile”)。按钮(:value,“Upload File”)。单击。当我这样做的时候,我看到按钮甚至会亮起来,但不知怎么的,它实际上并没有执行。也许这与HTML有关。它使用带有类型按钮的输入类,但紧跟在类型文件之后。当我使用firebug并突出显示按钮时,它实际上指向文件类型和id,而不是按钮本身。真让人困惑。我甚至试过browser.frame(:id=>“uploadfile”)。button(:class=>“ui_button”)。单击它,它只会高亮显示按钮一秒钟,其他什么都没有。如果你看到flash,这就很好地表明Watir试图单击它。但是如果什么都没有发生,那么可能是客户端javascript正在寻找某个特定事件和一个简单的.click不够好。仔细查看该按钮的代码,看看该元素上是否指定了buttonup之类的事件,您可能需要使用.fireEvent来触发代码正在查找的特定事件。或者发布该区域中元素的代码,作为对原始问题的编辑。
browser.frame(:id => "uploadfile").button(:id => "click_me").click