8

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

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

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

4

6 に答える 6

12

私はRubyの専門家ではなく、構文エラーを起こす可能性がありますが、一般的なアイデアを得ることができます。

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

このコードはスローしませんNoSuchElementException

implicitlyWaitただし、ゼロより大きく、ページに要素がない場合、このメソッドはしばらくの間「ハング」します。2番目の問題-要素がページに存在するが表示されていない場合は、が表示されますtrue

回避策を実行するには、メソッドを作成してみてください。

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
于 2012-12-03T18:36:53.437 に答える
8

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

したがって、try catchブロックを使用する独自のメソッドを記述し、例外がない場合はtrueを返し、例外がある場合はfalseを返すことができます。

于 2012-12-03T05:02:02.817 に答える
2

要素が何があってもページ上にあることが予想される場合:を使用するのではなく、でセレン待機オブジェクトを使用します。element.displayed?begin/rescue

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

これは、ページの一部が他の部分よりも適切にレンダリングされるのに時間がかかる場合に役立ちます。

于 2017-08-15T19:22:35.130 に答える
0

selenium-webdriver version 3.14.0今月初めにリリースしたものを使用しています。私は@web_driver_instance.find_element(:xpath, "//div[contains(text(), 'text_under_search')]").displayed?使用をチェックしようとしていました:

element_exists = @wait.until { @web_driver_instance.find_element(:xpath, "//div[contains(text(), 'text_under_search')]").displayed? }

 unless element_exists
   #do something if the element does not exist
 end

NoSuchElementError上記は例外で失敗したので、以下を使用してみました:

begin
   @wait.until { @web_driver_instance.find_element(:xpath, "//div[contains(text(), 'text_under_search')]").displayed? }

rescue NoSuchElementError
  #do something if the element does not exist
end

これも私にはうまくいかず、NoSuchElementError例外を除いて再び失敗しました。

私がチェックしていたテキストの存在はページ上で一意である可能性が高いので、以下で試してみましたが、これは私にとってはうまくいきました:

unless /text_under_search_without_quotes/.match?(@web_driver_instance.page_source)
   #do something if the text does not exist
end
于 2018-08-26T10:46:16.067 に答える
0

要素を検索

解決策#1

expect(is_visible?(page.your_element)).to be(false) 
[or]
expect(is_visible?(@driver.find_element(:css => 'locator_value'))).to be(false)
[or]
expect(is_visible?(@driver.first(:css => 'locator_value'))).to be(true)

=>一般的なルビー法

  def is_visible?(element)
    begin
      element.displayed?
      return true
    rescue => e
      p e.message
      return false
    end
  end

解決策#2

expect(is_visible?(".locator_value")).to be(false)  # default css locator
[or]
expect(is_visible?("locator_value", 'xpath')).to be(true)
[or]
expect(is_visible?("locator_value", 'css')).to be(false)
[or]
expect(is_visible?("locator_value", 'id')).to be(false)

=>一般的なルビー法

  def is_visible?(value, locator = 'css')
    begin
      @driver.first(eval(":#{locator}") => value).displayed?
      return true
    rescue => e
      p e.message
      return false
    end
  end

要素の検索(要素のリスト)

解決策#1

=>ページクラスで宣言された変数

proceed_until(@driver.find_elements(:css => 'locator_value').size == 0)
[or]
proceed_until(@driver.all(:css => 'locator_value').size == 0)

=>一般的なルビー法

  def proceed_until(action)
    init = 0
    until action
      sleep 1
      init += 1
      raise ArgumentError.new("Assertion not matching") if init == 9
    end
  end
于 2018-09-05T13:03:43.223 に答える
-5

以下のリンクを調べて、解決策を見つけてください。

http://code.google.com/p/selenium/wiki/RubyBindings

于 2012-12-03T06:58:45.793 に答える