【问题标题】:Fail to use statement IF in Selenium无法在 Selenium 中使用语句 IF
【发布时间】:2015-05-27 12:44:44
【问题描述】:

目前我正在尝试使用语句IF(如果页面中出现按钮,则运行IF),参见方法登录系统

如果页面中没有出现按钮,我想运行下一个方法删除并添加新费用

require "selenium-webdriver"
require "rspec"
require "rspec/expectations"

describe "#Add simple expense and after add a receipt", :suitee => true do

before(:all) do
  @driver = Selenium::WebDriver.for :chrome
  @base_url = "http://sitetest.com"
  @driver.manage.window.maximize
end

it "Login in the system" do
  @driver.get(@base_url)
  @driver.find_element(:id, "user_email").send_keys "rafael@gmail.com"
  @driver.find_element(:id, "user_password").send_keys "123456"
  @driver.find_element(:name, "commit").click
    if(@driver.find_element(:css, ".btn.btn-lg.btn-success.btn-block").displayed?)
        @driver.find_element(:css, ".btn.btn-lg.btn-success.btn-block").click
        @driver.find_element(:css, ".introjs-button.introjs-skipbutton").click
        @driver.find_element(:css, ".i.i-pencil").click
    end
end

it "Remove and add new expense" do
  begin 
    while(@driver.find_element(:css, ".i.i-pencil.icon").displayed?)
     button = @driver.find_element(:id, "expense-bulk-select")
     @driver.action.click(button).perform 
     delete = @driver.find_element(:id, "delete-multi-btn")
     @driver.action.click(delete).perform
     waitDisplayModal = Selenium::WebDriver::Wait.new(:timeout => 10)
     waitDisplayModal.until {@driver.find_element(:class => "bootstrap-dialog-footer-buttons")}
     @driver.find_element(:xpath, "//div[3]/div/div/button[2]").click 
     sleep 3
  end 
rescue Selenium::WebDriver::Error::NoSuchElementError 
   @driver.find_element(:id, "current_expense_merchant").send_keys "Taxi to work" 
   @driver.find_element(:id, "current_expense_amount").send_keys "50"
   @driver.find_element(:id, "button-add-expense").click
   waitDisplayIconTrash = Selenium::WebDriver::Wait.new(:timeout => 20)
   waitDisplayIconTrash.until {@driver.find_element(:css => ".i.i-pencil.icon")}
 end
end

 after(:all) do
  @driver.quit   
 end
end

我的问题:当我运行这个脚本时,在我的控制台中出现这个:

Failure/Error: if(@driver.find_element(:css, ".btn.btn-lg.btn-success.btn-block").displayed?)
 Selenium::WebDriver::Error::NoSuchElementError:
   no such element
     (Session info: chrome=42.0.2311.135)
     (Driver info: chromedriver=2.9.248304,platform=Linux 3.13.0-24-generic x86_64)

也就是说,IF 没有按我的意愿工作。我该如何解决?

干杯

【问题讨论】:

  • 创建一个名为display的函数。检查元素是否显示。如果抛出异常,捕获它并返回 false。
  • 事实上,我不想使用救援,因为它给出错误“Selenium WebDriver :: :: Error :: NoSuchElementError”,将运行救援方法“删除并添加新费用”。了解我吗?
  • 你所做的是完全错误的。每个测试一次只能测试一件事。为按钮出现时的测试编写一个测试,为另一种情况编写另一个测试。您根本不应该真正使用 IF 语句,如果必须这样做,那是代码异味,而且您做错了。
  • @Arash M - 你有例子吗?

标签: ruby if-statement selenium rspec selenium-webdriver


【解决方案1】:

https://code.google.com/p/selenium/wiki/RubyBindings 使用 Wait 类显式等待某些条件:

wait = Selenium::WebDriver::Wait.new(:timeout => 3)
wait.until { driver.find_element(:css, ".btn.btn-lg.btn-success.btn-block").displayed? }
....

【讨论】:

  • 但是我如何才能使用 IF 和 ELSE?有了这个你的解决方案,如果没有找到元素?
  • @Rafael 我是对的,您不会在元素出现时等待。你只想检查元素存在吗?可能这会起作用:如果 driver.find_elements(:css, ".btn.btn-lg.btn-success.btn-block").present? ... 否则 ... 结束
  • find_element 将返回 nil 如果元素不存在并且您不能调用方法 - 显示?。您必须改用 find_elements。
猜你喜欢
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 2015-05-21
  • 1970-01-01
相关资源
最近更新 更多