From aaba4d12458051c19f4249632d92f0c1d25894d2 Mon Sep 17 00:00:00 2001 From: Matthew Horan Date: Wed, 28 Mar 2012 11:46:07 -0400 Subject: [PATCH] Find window by name, title or URL --- lib/capybara/driver/webkit.rb | 4 ++-- lib/capybara/driver/webkit/browser.rb | 4 ++-- spec/driver_spec.rb | 30 +++++++++++++++++++++++++-- src/WebPage.cpp | 9 ++++++++ src/WebPage.h | 1 + src/WindowFocus.cpp | 5 ++++- 6 files changed, 46 insertions(+), 7 deletions(-) diff --git a/lib/capybara/driver/webkit.rb b/lib/capybara/driver/webkit.rb index 0fc9acf..9d977e3 100644 --- a/lib/capybara/driver/webkit.rb +++ b/lib/capybara/driver/webkit.rb @@ -92,9 +92,9 @@ class Capybara::Driver::Webkit end end - def within_window(handle) + def within_window(selector) current_window = window_handle - browser.window_focus(handle) + browser.window_focus(selector) begin yield ensure diff --git a/lib/capybara/driver/webkit/browser.rb b/lib/capybara/driver/webkit/browser.rb index b7deb54..9d7bbd5 100644 --- a/lib/capybara/driver/webkit/browser.rb +++ b/lib/capybara/driver/webkit/browser.rb @@ -81,8 +81,8 @@ class Capybara::Driver::Webkit command("SetSkipImageLoading", skip_image_loading) end - def window_focus(handle) - command("WindowFocus", handle) + def window_focus(selector) + command("WindowFocus", selector) end def get_window_handles diff --git a/spec/driver_spec.rb b/spec/driver_spec.rb index acb2d4f..a4569e4 100644 --- a/spec/driver_spec.rb +++ b/spec/driver_spec.rb @@ -1558,7 +1558,7 @@ describe Capybara::Driver::Webkit do body = <<-HTML

bananas

@@ -1566,7 +1566,7 @@ describe Capybara::Driver::Webkit do else params = request.params sleep params['sleep'].to_i if params['sleep'] - body = "

finished

" + body = "My New Window

finished

" end [200, { 'Content-Type' => 'text/html', 'Content-Length' => body.length.to_s }, @@ -1593,5 +1593,31 @@ describe Capybara::Driver::Webkit do subject.within_window(subject.window_handles.last) { } subject.find("//p").first.text.should == "bananas" end + + it "supports finding a window by name" do + subject.visit("/new_window") + subject.within_window('myWindow') do + subject.find("//p").first.text.should == "finished" + end + end + + it "supports finding a window by title" do + subject.visit("/new_window") + subject.within_window('My New Window') do + subject.find("//p").first.text.should == "finished" + end + end + + it "supports finding a window by url" do + subject.visit("/new_window") + subject.within_window("http://127.0.0.1:#{subject.server_port}/test?") do + subject.find("//p").first.text.should == "finished" + end + end + + it "raises an error if the window is not found" do + expect { subject.within_window('myWindowDoesNotExist') }. + to raise_error(Capybara::Driver::Webkit::WebkitInvalidResponseError) + end end end diff --git a/src/WebPage.cpp b/src/WebPage.cpp index 62ffa3b..6aaec36 100644 --- a/src/WebPage.cpp +++ b/src/WebPage.cpp @@ -258,3 +258,12 @@ QWebPage *WebPage::createWindow(WebWindowType type) { QString WebPage::uuid() { return m_uuid; } + +QString WebPage::getWindowName() { + QVariant windowName = mainFrame()->evaluateJavaScript("window.name"); + + if (windowName.isValid()) + return windowName.toString(); + else + return ""; +} diff --git a/src/WebPage.h b/src/WebPage.h index 5a88dc9..2114428 100644 --- a/src/WebPage.h +++ b/src/WebPage.h @@ -24,6 +24,7 @@ class WebPage : public QWebPage { void resetWindowSize(); QWebPage *createWindow(WebWindowType type); QString uuid(); + QString getWindowName(); public slots: bool shouldInterruptJavaScript(); diff --git a/src/WindowFocus.cpp b/src/WindowFocus.cpp index e9acce6..5fbddd3 100644 --- a/src/WindowFocus.cpp +++ b/src/WindowFocus.cpp @@ -26,7 +26,10 @@ void WindowFocus::focusWindow(QString selector) { while (pageIterator.hasNext()) { WebPage *page = pageIterator.next(); - if (selector == page->uuid()) { + if (selector == page->getWindowName() || + selector == page->mainFrame()->title() || + selector == page->mainFrame()->url().toString() || + selector == page->uuid()) { success(page); return; }