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但是,如果您有多个零并且页面上没有元素,则此方法将“挂起”一段时间。第二个问题 - 如果页面上存在元素但未显示,您将得到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

如果期望元素无论如何都应该在页面上:使用selenium 等待对象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 回答