2012-12-03 43 views
7

要素がSelenium Webドライバに存在するかどうかを確認する方法はありますか?私はこのコードを使用しよう:要素が存在するかどうかを確認する

if @driver.find_element(:link, "Save").displayed? == true 

をそれは私がまだスクリプトが実行を継続したいので、私は期待したものではありませんこれは、例外で中断します。

答えて

6

@driver.find_elementNoSuchElementExceptionと呼ばれる例外をスローします。

だから、catchブロックを試してみて、例外がある場合は例外と虚偽がない場合にtrueを返し使用する独自のメソッドを書くことができます。

+1

おかげで、私は「救助」を使用し、それは、あなたが答えを受け入れるべき助けit..If聞くために、この問題 – Thanh

+0

GR8を解決しました。 –

+0

私は今、あなたの答えを受け入れるが、私はあなたにこの時間を借りてみましょうするのに十分な評判(最小15)を持っていない、私は後であなたの答えを受け入れる:) – Thanh

7

私はRubyの専門家ではないし、いくつかの構文エラーを作ることができますが、一般的なアイデアを得ることができます。

if @driver.find_elements(:link, "Save").size() > 0 

このコードはNoSuchElementException

をスローしません。しかし、この方法では、意志implicitlyWaitがゼロ以上で、ページに要素がない場合、しばらくの間「ハング」します。 2番目の問題 - if要素がページ上に存在するが、表示されない場合は、trueと表示されます。要素が関係なく、私はそれが役に立つというbegin/rescueを使用するよりも、element.displayed?selenium wait objectを使用するために何を見つけるのページにあってはならないことが予想されます場合は

def is_element_present(how, what) 
    @driver.manage.timeouts.implicit_wait = 0 
    result = @driver.find_elements(how, what).size() > 0 
    if result 
     result = @driver.find_element(how, what).displayed? 
    end 
    @driver.manage.timeouts.implicit_wait = 30 
    return result 
end 
+0

提案していただきありがとうございます。私はメソッド "ハング"をもう待つ必要はありません – Thanh

+0

なぜimplicit_waitが必要ですか?ページ全体が読み込まれた後に要素が存在することを確認するので、それを持たないほうがいいですか?それとも、私はこれを理解するのに間違っていますか?助けて! –

1

メソッドを作成しようと回避策

wait = Selenium::WebDriver::Wait.new(:timeout => 15) 
element = $driver.find_element(id: 'foo') 
wait.until { element.displayed? } ## Or `.enabled?` etc. 

これは、ページの一部が適切に他のものよりもレンダリングに時間がかかるの場合に有用です。

関連する問題