Capybara with selenium, send_key doesn't work - ruby

I'm using Cucumber to test a comment form that doesn't have a submit button. I found that selenium has a method called send_key, which in theory should allow me to do this:
find_field('my-field').native.send_key(:enter)
But when I run my test, I get:
undefined method `send_key' for #<Nokogiri::XML::Element:0x007f874b361828> (NoMethodError)
Not a clue what I'm doing wrong. Any ideas?

You have to use the Selenium driver and not the :rack_test driver in Capybara to access the send_keys method:
Install the gem selenium-webdriver and add it to your gem file if you are using bundler.
Mark your test using :js => true so that it runs with the Selenium driver.
You get an error because by default, Capybara uses the :rack_test driver. Calling native on an element access the driver specific methods. :rack_test driver elements are implemented natively as Nokogiri::XML::Element, therefore the send_keys methods do not exists and you get this error.

Try with xpath
within(:xpath, "//form[#id='the_form']") do
locate(:xpath, "//input[#name='the_input']").set(value)
locate(:xpath, "//input[#name='the_input']").node.send_keys(:return)
end

You could also have a hidden button. Capybara can see it and click it.
<%= form.submit "OK", style: "display: none;" %>
Then in your test:
Capybara.ignore_hidden_elements = false
click_on "OK"

Related

Why capybara codes don't work with selenium webdriver?

I am new to Capybara. I have a question about why my Capybara doesn't work when I use it together with Selenium Webdriver.
This is my sample code:
Given(/^I am on the Youtube homepage$/) do
# visit 'http://www.youtube.com'
driver = Selenium::WebDriver.for :firefox
driver.navigate.to('http://www.youtube.com')
end
When(/^I search for "([^"]*)"$/) do |search_term|
fill_in 'search_query', :with => search_term
click_on 'search-btn'
end
Then(/^videos of large rodents are returned$/) do
expect(page).to have_content 'Making Friends with a Capybara'
end
When I run it, it just open Firefox and go to Youtube homepage. But it gets error:
Capybara::ElementNotFound: Unable to find field "search_query".
Everything works with visit 'http://www.youtube.com' command.
You're creating a driver, telling it to navigate to a page and then it's going out of scope so it's getting deleted. the visit line works because it's using the current capybara driver which stays around between test steps. Rather than creating a driver manually you should be registering a driver with Capybara and then specifying which driver to use for the specific test. See drivers
Since capybara sets up a selenium driver by default for use with firefox you can just do
Capybara.default_driver = :selenium
somewhere before running your tests to make all your tests run using selenium with firefox, or since capybara registers selenium as the default javascript driver you can tag any scenarios you want to run in firefox with #javascript as shown here
#javascript
Scenario: do something something
Given ...

Failed to run custom step with the selenium cucumber ruby

I am writing a test for desktop web automation using the
selenium cucumber ruby.
My test includes both predefined and custom steps.
However, my test fails to run due to an error caused by a custom step.
The feature file that I run:
Feature: Login a customer
Scenario: Go in a call
Given I navigate to <url>
...
When I submit the form with id "custSearchSimple"
....
And I wait for 5 sec
Then element having id "accNumber" should be present
The When I submit the form with id "custSearchSimple" is a custom step.
This step is defined in the custom_step.rb. I have used the submit command of the Selenium Cucumber Ruby API. The custom_step.rb is the following file:
require 'selenium-cucumber'
# Do Not Remove This File
# Add your custom steps here
# $driver is instance of webdriver use this instance to write your custom code
#firefox browser instantiation
driver = Selenium::WebDriver.for :firefox
driver.navigate.to "https://localhost/telebet"
When(/^I submit the form with id "(.*?)"$/) do |arg1|
element= driver.submit(:id,"#{arg1}")
end
When I run the feature file by running cucumber features/name_of_the_file.feature, I get the NoMethodError error:
When I submit the form with id "custSearchSimple" # features/step_definitions/custom_steps.rb:12
private method `submit' called for #<Selenium::WebDriver::Driver:0x94c4bde4bdff4d6 browser=:firefox> (NoMethodError)
I could not find any example using the Selenium Cucumber Ruby API for writing custom steps. I suspect that I might have omitted some commands for the selenium web driver ruby. Something is missing that I could not find. Does anyone know why I get this error?
Maybe I am confused here but:
When(/^I submit the form with id "(.*?)"$/) do |arg1|
submit_form arg1
end
def submit_form(form_id)
submit("id", form_id)
end
Would do what you want? submit_form isn't a cucumber step, it's a ruby method - probably why you're getting Cucumber::UndefinedDynamicStep.

How do I send keys using Capybara with selenium web driver

I know capybara uses native, do I need to install a gem for this?
I am trying to press enter after typing in a search box
If using capybara 2.5 you can do
input = find_field 'id, name, label of search box'
input.send_keys 'text to send', :enter
If using capybara < 2.5 with selenium it would be
input.native.send_keys 'text to send', :enter

undefined method select_list using ruby with watir 2.0 & selenium web driver

I'm new to using ruby and watir and learning it as i go.
I'm trying to select an entry in a selection box using the select_list method but keep getting
'undefined method 'select_list' for #selenium::webdriver. <NoMethodError>
the line of code I'm using to make the selection is
browser.select_list(:name, "linkType").set("Content Page")
and I've also tried
browser.select_list(:name, "linkType").select("Content Page")
The site code i'm looking to call from is
<select name="linkType" size="4">
<option value="Content Page">Content Page</option>
<option value="Preset Page">Preset Page</option>
<option value="Form">Form</option>
</select>
I'm probably missing something simple, but this is my first time working with ruby/watir/selenium.So any help would be greatly appreciated.
I can think of two possible reasons for the exception.
Browser is the wrong type
Based on the exception, it is saying that browser is a Selenium::Webdriver object. To use the select_list method you need a Watir::Browser (or Watir::Element) object.
I am guessing that somewhere you have the line:
browser = Selenium::WebDriver.for :firefox
This is creating a Selenium browser/driver instead of a Watir browser. You want to do:
browser = Watir::Browser.new :firefox
Using incorrect version of Watir
Based on the title of the question, you are trying to use Watir 2.0 and Selenium-Webdriver. These are not compatible with each other. Watir 2.0, which is now Watir-Classic, does not use Selenium-Webdriver at all.
If you want to use Selenium-Webdriver with a Watir API (ie methods like select_list), you need to use the Watir-Webdriver gem.
In other words, the top of your script would have:
require 'watir-webdriver'
browser = Watir::Browser.new :ff
Or, if you have the Watir meta gem installed, using any browser other than IE would cause the Watir-Webdriver gem to load:
require 'watir'
browser = Watir::Browser.new :ff

send Ctrl-S to browser in Capybara Webkit test

I have JavaScript in my application that submits a form when the user hits Ctrl-S or Cmd-S. I want to write an automated test for this using RSpec, Capybara, and Capybara Webkit. I don't think I can just have Capybara execute JavaScript to trigger Ctrl-S/Cmd-S because that's not normally allowed with JavaScript in Chrome as a security concern. I see with Selenium there are page.driver.browser.action.key_down/key_up methods available. Is there anything similar with Capybara Webkit? If not, how can I send Ctrl-S and Cmd-S to the browser in my test?
Edit: I also can't get this to work using the regular Selenium driver with Firefox:
describe 'edit a template and hit Ctrl-S', js: true do
render_views
it 'saves the template' do
visit my_path
page.execute_script("$('#hidden_textarea').val('Fabulous new content')")
builder = page.driver.browser.action
builder.key_down(:control).send_keys('s').key_up(:control).perform
expect(page).to have_text('Record was saved.')
expect(page).to have_text('Fabulous new content')
end
end
It looks like the builder.key_down(:control).send_keys('s').key_up(:control).perform isn't doing anything--the page loads in Firefox but just sits there. This is with Firefox 19 on OS X with selenium-webdriver 2.35.1.
Any suggestions on how to get this to work in either Firefox or Chrome, with either Selenium or Capybara Webkit?
I'm trying to do a similar thing in Chrome using Capybara and SitePrism. This actually works for me in Firefox though:
page.element.native.send_keys :command, 'a'
so I suggest trying this
builder.native.send_keys :control, 's'

Resources