require 'spec_helper' require 'capybara/driver/webkit' describe Capybara::Driver::Webkit do let(:hello_app) do lambda do |env| body = <<-HTML
Change me
Push me
Release me
Can't see me
Next HTML [200, { 'Content-Type' => 'text/html', 'Content-Length' => body.length.to_s }, [body]] end end before(:all) { @@browser = Capybara::Driver::Webkit::Browser.new } subject { Capybara::Driver::Webkit.new(hello_app, :browser => @@browser) } before { subject.visit("/hello/world?success=true") } after { subject.reset! } it "finds content after loading a URL" do subject.find("//*[contains(., 'hello')]").should_not be_empty end it "has an empty page after reseting" do subject.reset! subject.find("//*[contains(., 'hello')]").should be_empty end it "raises an error for an invalid xpath query" do expect { subject.find("totally invalid salad") }. to raise_error(Capybara::Driver::Webkit::WebkitError, /xpath/i) end it "returns an attribute's value" do subject.find("//p").first["id"].should == "greeting" end it "parses xpath with quotes" do subject.find('//*[contains(., "hello")]').should_not be_empty end it "returns a node's text" do subject.find("//p").first.text.should == "hello" end it "returns the current URL" do port = subject.instance_variable_get("@rack_server").port subject.current_url.should == "http://127.0.0.1:#{port}/hello/world?success=true" end it "returns the source code for the page" do subject.source.should =~ %r{.*greeting.*}m end it "aliases body as source" do subject.body.should == subject.source end it "evaluates Javascript and returns a string" do result = subject.evaluate_script(%) result.should == "hello" end it "evaluates Javascript and returns an array" do result = subject.evaluate_script(%<["hello", "world"]>) result.should == %w(hello world) end it "evaluates Javascript and returns an int" do result = subject.evaluate_script(%<123>) result.should == 123 end it "evaluates Javascript and returns a float" do result = subject.evaluate_script(%<1.5>) result.should == 1.5 end it "evaluates Javascript and returns null" do result = subject.evaluate_script(%<(function () {})()>) result.should == nil end it "evaluates Javascript and returns an object" do result = subject.evaluate_script(%<({ 'one' : 1 })>) result.should == { 'one' => 1 } end it "evaluates Javascript and returns true" do result = subject.evaluate_script(%) result.should === true end it "evaluates Javascript and returns false" do result = subject.evaluate_script(%) result.should === false end it "evaluates Javascript and returns an escaped string" do result = subject.evaluate_script(%<'"'>) result.should === "\"" end it "evaluates Javascript with multiple lines" do result = subject.evaluate_script("[1,\n2]") result.should == [1, 2] end it "executes Javascript" do subject.execute_script(%) subject.find("//p[contains(., 'yo')]").should_not be_empty end it "raises an error for failing Javascript" do expect { subject.execute_script(%) }. to raise_error(Capybara::Driver::Webkit::WebkitError) end it "clicks an element" do subject.find("//a").first.click subject.current_url =~ %r{/next$} end it "returns a node's tag name" do subject.find("//p").first.tag_name.should == "p" end it "fires a mouse event" do subject.find("//*[@id='mouseup']").first.trigger("mouseup") subject.find("//*[@class='triggered']").should_not be_empty end it "fires a non-mouse event" do subject.find("//*[@id='change']").first.trigger("change") subject.find("//*[@class='triggered']").should_not be_empty end it "fires drag events" do draggable = subject.find("//*[@id='mousedown']").first container = subject.find("//*[@id='mouseup']").first draggable.drag_to(container) subject.find("//*[@class='triggered']").size.should == 2 end it "finds visible elements" do subject.find("//p").first.should be_visible subject.find("//*[@id='invisible']").first.should_not be_visible end end