我对自动化和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")
工作得非常好。
抱歉这么久。只是想确保我提供了足够的信息。提前感谢您的帮助。
答案 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
属性。