无论如何都要检查Selenium网络驱动程序中是否存在元素?我尝试使用这段代码:
if @driver.find_element(:link, "Save").displayed? == true
但它会在异常中中断,这不是我的预期,因为我仍然希望脚本继续运行。
答案 0 :(得分:9)
我不是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
答案 1 :(得分:6)
@driver.find_element
会抛出一个名为NoSuchElementError
的异常。
因此,您可以编写自己的方法,该方法使用try catch块,并在没有异常时返回true,在有异常时返回false。
答案 2 :(得分:1)
如果预计该元素应位于页面上,无论我认为将selenium wait object与element.displayed?
一起使用是有用的,而不是使用begin/rescue
:< / p>
wait = Selenium::WebDriver::Wait.new(:timeout => 15)
element = $driver.find_element(id: 'foo')
wait.until { element.displayed? } ## Or `.enabled?` etc.
这在页面的某些部分需要更长时间才能正确呈现的情况下非常有用。
答案 3 :(得分: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
答案 4 :(得分:0)
查找元素
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
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
查找元素(元素列表)
=> 页面类中声明的变量
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
答案 5 :(得分:-4)
请查看以下链接,它将为您提供解决方案。