iframe内的Watir和文本字段

时间:2012-03-05 00:38:52

标签: ruby iframe watir

我正在尝试使用Watir将新文本设置到文本字段中。文本字段位于iframe内。

<div id="div_popup_layer" style="width: 100%; height: 100%;">
<div id="id_Login" class="ui-draggable" style="position:absolute;left:372.5px;top:279px;width:501px;height:274px;z-index:15">
<table id="popup_cont_id_Login" cellspacing="0" cellpadding="0" topmargine="0">
<tbody>
<tr>
<td align="left" valign="middle">
<iframe id="frame_id_Login" height="274px" frameborder="0" width="501px" allowtransparency="true" src="/sws.login/gnb/loginView.sws?basedURL=undefined&popupid=id_Login" tagtype="popup_iframe" name="frame_id_Login">

文本字段有下一个Xpath:

//*[@id="IDUserId"]

或CSS路径:

html body#POPUP_BODY table#loginBackground tbody tr td form#loginForm table tbody tr td table tbody tr td table tbody tr td div#userIDBlock table tbody tr td table tbody tr td#swsText_body_IDUserId_td.sws_text_normal_body div input#IDUserId.sws_text_input

对于HTML,它看起来像这样:

<div><input type="text" value="" maxlength="63" style="width:142px; " class="sws_text_input" name="IDUserId" id="IDUserId" onfocus=" swsText_styleChangedFocus('IDUserId');" autocomplete="off" tagtype="text"></div>

我检查了很多变种而没有成功。例如:

browser.frame(:id => "frame_id_Login").text_field(:name => "IDUserId").set "admin"

返回:

/var/lib/gems/1.8/gems/watir-webdriver-0.5.3/lib/watir-webdriver/elements/frame.rb:9:in `locate': unable to locate frame/iframe using {:id=>"frame_id_Login"} (Watir::Exception::UnknownFrameException)

有人可以帮我吗?我需要把任何文字放到这个领域。

4 个答案:

答案 0 :(得分:3)

@browser.text_field(:id => "IDUserId").set "TEXT"
@browser.text_field(:name => "IDUserId").set "TEXT"
@browser.text_field(:class => "sws_text_input").set "TEXT"

只要不包含在框架中,这些文本字段都可以用于此文本字段,此时您需要识别它。

你只想使用Xpath作为最后的结果,因为它是脆弱和复杂的。我甚至不确定CSS是否有效,因为我从未尝试过。

请查看Željko's WATIR bookwww.watir.com了解基本定位器方法。

答案 1 :(得分:2)

自从发布这些答案后,watir可能已更新,但这些frame方法都不适用于我。我能够成功使用iframe方法,并像其他任何对象一样与之交互。一旦选择了iframe对象,我就可以在iframe调用成功后调用DOM元素。只能使用'id'标签选择iframe对象,即使它也有'name'属性..

browser.text_field(:id => "handle").exists?
#=> false

browser.iframe(:id => "secureform").text_field(:id => "handle").exists?
#=> true

答案 2 :(得分:1)

工作解决方案是:

browser.frame(:index => 1).text_field(:index => 0).set "admin"

现在我想了解原因:)

答案 3 :(得分:0)

另一个有效的解决方案 browser.frame(:id =&gt;“iFrameID”)。text_field(:id =&gt; /TextField/).set"data“

HTH