When I used selenium_webdriver and shows firefox, works fine; Now I migrate to headless browser, and configurate Poltergeist/PhantomJS in my automated tests, and not work's. Capybara / Poltergeist doesnt find elements anymore.
I mapped my elements with siteprism, here my example: element: link, "a[href='\my_link']"
When my tests run, throw this error:
Capybara::ElementNotFound: Unable to find css "a[href='/my_link']"
But when I use the method find_all
capybara/poltergeist find my element:
2016-08-26T19:27:21 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function() { return PoltergeistAgent.stringify((function (name, args) {\n return __poltergeist.externalCall(name, args);\n }).apply(this, PoltergeistAgent.JSON.parse(\"[\\\"find\\\",[\\\"css\\\",\\\"a[href='/my_link']\\\"]]\"))) })(); })()"
2016-08-26T19:27:21 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "{\"value\":[557]}")
{"command_id":"fc012779-4b24-4659-afba-14180c3aa717","response":{"page_id":1,"ids":[557]}}
=> []#<Capybara::Result:0x3fd82e69da98>
This is my configuration of Poltergeist driver:
#env.rb
Capybara.default_max_wait_time = 10
Capybara.register_driver :poltergeist do |app|
options = {
:js_errors => true,
:timeout => 120,
:debug => true,
:window_size => [1280, 1024],
:phantomjs_logger => File.open(FILE_PATH + "test_phantomjs.log", "w+"),
:phantomjs_options => ['--load-images=no', '--disk-cache=false', '--ignore-ssl-errors=yes', '--debug=true', '--ssl-protocol=TLSv1'],
:inspector => false,
}
Capybara::Poltergeist::Driver.new(app, options)
end
Capybara.javascript_driver = :poltergeist
Capybara.default_driver = :poltergeist
Capybara.current_driver = :poltergeist
steps.rb
Given(/^first step (\w+)$/) do |client_label|
@client = @client[client_label] ||= get_client(@clients.values.map{|s| s.name})
@app = App.new
@app.home.load
end
And(/^step example (\w+)$/) do |var|
@var = var
@app.home.action(@var)
end
app.rb
class App
def home
Home.new
end
def login
Login.new
end
end
home.rb
class Home < SitePrism::Page
set_url "https://#{USERNAME}:#{PASSWORD}@#{URL}"
element :link_account, "a[href='/account']"
element :link_1, "a[href='/link_1']"
element :link_2, "a[href='/link_2']"
element :link_3, "a[href='/link_3']"
##########################################
##########Methods of this page############
##########################################
def action(element)
element = mapping_elements(element)
test(element)
end
def mapping_elements(var)
case var
when "option1"
element = link_1
when "option2"
element = link_2
when "option3"
element = link_3
end
end
end
utils.rb
def test(element)
click_element(element)
end
def click_element(element)
element.click
end
I used :inspector => true
in my Poltergeist register driver, to open chrome to view my page;
I used chrome console document.querySelectorAll("a[href='/link_3']")
to select this element.
And returns the right element;
[<a class="foobar" title="Title" href="/link_3">text</a>]
If someone help me , I really appreciate;
Tks.