无法使用watir-webdriver定位iframe - Bug?

时间:2012-03-15 23:42:18

标签: watir-webdriver

我对自动化和watir-webdriver都很陌生,所以请原谅我,如果我听起来不是超级技术的话。

我正在尝试登录网站,登录表单位于iframe内部。在同一页面上还有另一个包含图像的iframe。

这是html:

<body>
<div class="topbar">
<div class="topbarcenter">
<ul>
<li id="logo" class="logo">
<div id="provider_logo">
<iframe id="logo_iframe" width="192px" height="128px" frameborder="0" src="http://social.onerecovery.com/modules/iframes/html/provider_logo.html?prov=microsites" onload="this.style.visibility = "visible";" style="visibility: visible;" allowtransparency="true">
</div>
</li>
<li class="login">
<iframe id="login_iframe" width="550px" height="70px" frameborder="0" src="http://social.onerecovery.com/modules/iframes/html/login.html" onload="this.style.visibility = "visible";" style="visibility: visible;" allowtransparency="true">
<html>
<head>
<body>
<div class="login_container">
<div id="login_div">
<form class="login_form" action="#" method="post">
<input type="text" maxlength="100" placeholder="Email Address..." class="email_input processed" name="email">

顺便说一句,我使用的是watir-webdriver 0.3.5并在chrome 17上实现自动化

我试过的是: $b.frame(:id => "login_iframe").form(:class => "login_form").text_field(:name => "email").set("username")

我认为它会起作用,但在我的命令行中我得到错误:Watir::Exception::UnknownObjectException: unable to locate element, using {:class=>"login_form", :tag_name=>"form"}

我也尝试将iframe编入索引以确保我在第二个iframe而不是第一个iframe,但它仍然无效。

当我这样做的时候 我知道命令行$b.frame(:id => "login_iframe").exists? true

但是当我这样做的时候 我知道命令行$b.frame(:id => "login_iframe").form(:class => "login_form").exists? false

问题是我们有另一个页面,有人可以用来登录同一个网站,该页面与此页面之间的唯一区别是该页面有第二个iframe,而另一个页面只有登录iframe和码 $b.frame(:id => "login_iframe").form(:class => "login_form").text_field(:name => "email").set("username") 工作得非常好。 抱歉这么久。只是想确保我提供了足够的信息。提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

解决问题的简短答案是使用browser.frame(:index => 2)代替browser.frame(:id => "login_iframe")

或者,如果您想要一个更强大的解决方案:

frame = browser.frames.find{ |frame| frame.form(:class => "login_form").exists? }
frame.form(:class => "login_form").text_field(:name => "email").set("username")

那就是说,我真的不知道为什么会有效。它就像它认为登录控件在invite_iframe内部,它在HTML中看起来不像。我会尝试深入挖掘,但听起来像是一个错误。

似乎所有的iframe都很有趣。如下所示,每个iframe中的文本字段数与预期的不匹配。

browser.frames.each{ |x| puts x.id + ' - ' + x.text_fields.length.to_s + ' text_fields' }
#=> logo_iframe - 3 text_fields
#=> login_iframe - 0 text_fields
#=> invite_iframe - 2 text_fields

答案 1 :(得分:0)

对于最新版本,browser.iframes列出了当前窗口中的所有iframe。

browser.iframes.map {|iframe| iframe.src}

这将映射所有iframe的src属性。