2012-03-15 14 views
1

私はオートメーションとwatir-webdriverにはかなり新しいので、私はスーパーハイテクを聞かないと私を許します。watir-webdriverでiframeをターゲティングできません - バグですか?

ウェブサイトにログインしようとしていますが、ログインフォームは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"> 

私が試した私がワチール-webdriverを0.3.5を使用して

クロム17に自動化しています方法によってだった: $b.frame(:id => "login_iframe").form(:class => "login_form").text_field(:name => "email").set("username")

たI思考はうまくいくだろうが、私のコマンドラインでは、私はちょうどエラーを取得する:Watir::Exception::UnknownObjectException: unable to locate element, using {:class=>"login_form", :tag_name=>"form"}

私も試した最初のiframeではなく、2番目のiframeにあることを確認するためにiframeをデクシングしますが、まだ動作しませんでした。

私は、コマンドラインで $b.frame(:id => "login_iframe").exists?を行うと、私は true

を取得するが、私は、コマンドラインで $b.frame(:id => "login_iframe").form(:class => "login_form").exists?を行うとき、私は false

を得る事は、我々はその誰かができる別のページを持っているということです同じウェブサイトにログインするのに使用します。そのページとこのページとの唯一の違いは、このページに2番目のiframeがあるのに対し、もう1つのページにはログインiframeとコードのみがあることです。 $b.frame(:id => "login_iframe").form(:class => "login_form").text_field(:name => "email").set("username") は問題なく機能します。 すみません、申し訳ありません。ちょうど私が十分な情報を与えたことを確認したかったのです。助けを前にありがとう。

+0

2つの質問。 (1)あなたがテストしているページは一般に公開されていますか?あなたのHTMLサンプルを与えられた私のためのコードが動作するので、タイミングの問題(iframeがロード完了する前に、フォームにアクセスしようとしている)かどうか疑問に思っています。 (2)0.3.5ではなく、watir-webdriver 0.5.3(最新)を意味しましたか? –

+0

お返事ありがとうございます。1)サイトはhttp://microsites.onerecovery.comからアクセス可能です。コマンドラインでコードを1行ずつ実行すると、iframe内のフォームをまだターゲットできないため、タイミングの問題はありません。 2)私は、自動化を開始したときに使用していたwatir-webdriver 0.3.5を使用していますが、まだ最新バージョンにアップグレードしていません。私は本当にあなたが問題に抱いている洞察に感謝します。ありがとう。 – jennarae

+0

元のコードはFirefoxでうまく動作するので、ChromeDriverのバグだと思います。 –

答えて

0

browser.frame(:id => "login_iframe")の代わりにbrowser.frame(:index => 2)を使用して問題を解決してください。

それとも、もう少し堅牢なソリューションをしたい場合:動作する理由を述べ

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 
+0

それを調べていただきありがとうございます。私は助けに感謝します。私はWatirの男であるJariにメッセージを送り、時間があるときに彼がそれを調べることができるかどうか尋ねました。おそらくバグかもしれないと思う。 – jennarae

+0

クロムドライブのバグの場合は、他の操作を行う前にクロムドライバのバージョンを更新する必要があります。私はまたあなたのwatir - webdriverを最新の状態に保つことも考えています。最近のバージョンにはいくつか素敵な新しいものが登場しています。 –

0

、それは現在のウィンドウが持っているすべてのiframeを一覧表示しているbrowser.iframesです。

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

これは、すべてのiframeのsrc属性をマップします。

関連する問題