Currently I’m trying use a statement IF (If a button appears in the page, then run the IF), see the method Login in the system:
If the button doesn’t appear in the page, I would like to run the next method Remove and add new expense
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
``
My problem: When I run this script, appears this in my console:
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)
``
That is, the IF is not working as I would like. How can I fix it?
Currently I’m trying use a statement IF (If a button appears in the page, then run the IF), see the method Login in the system:
If the button doesn’t appear in the page, I would like to run the next method Remove and add new expense
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](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 "raf...@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).p erform delete = @driver.find_element(:id, "delete-multi-btn")
@driver.action.click(delete).p erform
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
``
My problem: When I run this script, appears this in my console:
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)
``
That is, the IF is not working as I would like. How can I fix it?
It means that the driver cab’t fins the CSS element you pass in, -
I want to just make one condition: IF find the button…clicks, else continues execution of the other methods
If the button doesn’t exist, you’re calling displayed? on it anyway.
@Scotte:
An element can exist but be hidden, that’s what #displayed? method checks according the API docs:
def displayed?
bridge.isElementDisplayed @id
end
The problem with the search by CSS is that you can have them more than one on a page. What if you try to find the same button by id ? Just add one your HTML code to see what will happen.
but that’s exactly what I want! I know that sometimes the element will not appear on the screen, so I need it to run another method, it is exactly this treatment I am trying to do. for this reason I put the IF condition. If the element exists, takes an action, orexists, performs the following method. Just to be clear, how would you do this?
but that’s exactly what I want! I know that sometimes the element will not appear on the screen, so I need it to run another method, it is exactly this treatment I am trying to do. for this reason I put the IF condition. If the element exists, takes an action, orexists, performs the following method. Just to be clear, how would you do this?
As I suggested, I’d change CSS to an ID and see what it will give.
Then I would check if there is no typo in CSS you of the button under test.
If there is still a weird behaviour I would try another gem, e.g. capybara, phantom JS, etc.