2012-02-24 17 views
1

私はWatir-webdriver 0.5.3を使用しています。watir-webdriverを使用して断続的な「要素はDOMに接続されなくなりました」

while $browser.div(:class => /^expander$/).exists? 
    $browser.div(:class => /^expander$/).click; sleep 1.5 
end 

クリックは、TreeViewコントロールを拡大し、それがクリックされたのdivのクラスを変更し実行するためにいくつかのjavascriptの原因:前0.4.x年頃のバージョンでは、このトラブルはなかったです。このスクリプトの目的は、拡張されていないものがなくなるまでノードを拡張し続けることです。

私は頻繁にを取得しています。「DOMに要素が追加されなくなりました」.existsの行です。これはespです。私が.exists?を広範囲に使用し始めた理由は、最初にスクリプトを直ちにクラッシュさせるようなエラーを避けるためでした。

視覚的に私はすぐに.clickの後に展開を観察し、私はそこで一時停止すると、Firebugはclass = 'expander'だけのdivがclassの代わりにdivで置換されたことを確認します= 'expander hasChildren expanded'、およびそのdivのみ。

webdriverからエラーが発生しているようです。

他に誰かがこの問題を抱えていたか回避策を推奨していますか?

earlier questionでは、新しいwatir-webdriverの動作が変更された後、そのクラスと完全に一致するように/^expander$/フォームに切り替える必要がありました。

+0

私は、ある種のAJAX/Javascriptによって更新された後、 '.exists? 'のDOMの新しいバージョンが表示されない、あるいは要素タイプとタグの検索で全く機能しないと思っています私はよく使う。 – Marcos

+0

domがまだ更新している間に、テストがブラウザにアクセスしている何らかの競合状態のように聞こえます。あなたが進める前に探すことができる、「作成された」新しいオブジェクトがありますか?あなたはおそらく何人の 'expander hasChildren' divを数え続けて、最新のものが現れるまで待つべきでしょうか? –

+0

私は '$ browser.driver.manage().timouts()。implicit_wait = 10'のようなことをやってみました。この種の問題は私がワイアを使い始めて以来私を悩ませてきました。私のコードが動くように、DOMを再読み込みするように強制する方法はありますか? (または私は 'send_keys ESC'を前に試したと思うが、ブラウザのDOMの更新を中断して再読み込みする) – Marcos

答えて

1

何を試してみてください?

while $browser.div(:class => /^expander$/).exists? 
    count = $browser.divs(:class => 'expander hasChildren expanded').size 
    $browser.div(:class => /^expander$/).click 
    $browser.wait_until{$browser.div(:class => 'expander hasChildren expanded', :index => count).exists?} 
end 

アクションが離れて行く事を引き起こしているところ私が使用している他のアプローチは、カウントを取得して、あなたを「次のもの」そのように、最初の方に戻って最後の項目から、インデックスによって動作していますアドレッシングはまだ存在するはずです。それは、あなたの前の行動が「最初のもの」をただ取り除いたところで、常に「最初のもの」に対処するよりも信頼性が高くなります。拡張する物が新しい 'エキスパンダー'クラスを開くならば、波の中でこれをしなければならないかもしれません。最初のティアを拡張し、次に2番目のティアを拡張することになります。現在表示されているすべてのエクスパンダを展開し、いつ表示されているエクスパンダがあるかを確認するメソッドを作ることを意味します。もしそうなら、メソッドを再度呼び出します。

+0

最後にこれをテストする機会を得る。おそらく '.wait_until()'にFalseClassを正確な数値に変換することはできません。代わりに '{}'でなければなりませんか?しかし、私はあなたがそこで何をしているのかを見ます。勉強するhttp://watirwebdriver.com/waiting/ – Marcos

+0

あなたのコメントを参考にして、これについてどう思いますか? 'hitlist = $ browser.divs(:class =>/^ expander $ /); hitlist.reverse.each {| r | r.click;睡眠.1}; $ browser.wait_until {$ browser.divs(:class => /^expander$/).size <1} 'ほぼ同時にすべてをクリックしているようだが、0が残るまでループが待った後 – Marcos

+0

Iブラウザの速度に大きく左右されるかもしれないし、jsが動作している間にアクションをバッファリングする能力があるか、または潜在的にクリック数の一部が見逃されてしまう可能性があると思うが、本当のためにそれを実行することがあなたの最高の賭けかもしれません。自分自身でIRBで試してみると、ブラウザを開いて手動でページに移動し、テストしたいコードのビットを貼り付け、何が起こるかを確認します。このようなものの中には、ブラウザとDOMを変更するJSとブラウザを動かすコードとの間のすべてのやりとりのために、試してみるまでわからないものがあります。 –

1

はこれについて、この1

Watir::Wait.until do 
    $browser.div(:class => /^expander$/).click 
    not $browser.div(:class => /^expander$/).exists? 
end 
+0

ありがとうが、エクスパンダレコードが1つしかないページに1つ。最初のものはクリックされて拡張され、新しい 'class =" expander hasChildren expanded "'を取得します。 – Marcos

+0

正規表現のロケータを修正するだけです。最新のWatir-WebDriverを使用している場合は、 '$ browser.div(:class => 'expander')' – p0deje

+0

の部分クラスをサポートしています。私を[square one]に戻します(http://stackoverflow.com/questions/9317245/how-to-exactly-match-using-class-selector-in-watir-webdriver)私はすべての古いものを改造しなければなりませんでした単なる引用符ではなく '/^...$/'正規表現でコードしますが、ありがとうございます。私は[チャックの答え](http://stackoverflow.com/a/9436421/1069375)は一般的に私に影響を与えるものだと思う。セマンティクス/ DOM相互作用の深いセマンティクスは、Watir APIユーザーが気にする必要がある(私は思う)。 – Marcos

0

Chuck's approach後、このコードは、第1の拡大を取得するためにクリックするか、または何でも必要なすべての候補を列挙して、1行のforeachループで、上がってページの下からそれらをクリック:

hitlist = $browser.divs(:class => /^expander$/) # put all candidates into an array 

hitlist.to_a.reverse.each {|r| r.click; sleep 0.1} # loop in reverse 

$browser.wait_until { $browser.divs(:class => /^expander$/).size < 1} # Wait until they're all AJAXed out of existence 

暫定& 2は、暫定的なhitlistコレクションが便利だとは思わない場合は、単純に$browser.divs(:class => /^expander$/).to_a.reverse.each {|r| r.click; sleep 0.1}に圧縮することもできますが、それは気にしません。

しかし、コードが健全に見えても、私の主な関心事は、/^expander$/のような正規表現のロケータを使用すると、非常に厳しいパフォーマンスのペナルティになります。 :class => "expander"のような標準の引用クラスのロケータが排他的にマッチしたとき、私は0.5.3より前に直面していました。一度か二度

許さだろう(div(:class => /^expander$/)を見つける私の場合は、< 100KBのhtmlページたびに5-50秒かかります)が、私はライン3について特に心配している:どのように何回も滞在することです条件が最終的に満たされた場合、{boolean test block}が実行されてポーリングされますか?

+0

私は試してみましたが、 '.reverse'はありませんが、ElementCollection_'#[]、#each、#first、#initialize、 #last、#length、#to_a' '.to_a'の前に追加します – Marcos

関連する問題