From 3f519cd14743fb15efbbaab0e123aac42b6b94d8 Mon Sep 17 00:00:00 2001 From: Joe Ferris Date: Sat, 26 Feb 2011 14:03:30 -0500 Subject: [PATCH] Implemented Driver#execute_script --- lib/capybara/driver/webkit.rb | 2 +- lib/capybara/driver/webkit/browser.rb | 4 ++++ spec/driver_spec.rb | 10 ++++++++++ src/Connection.cpp | 15 ++++++++++----- src/Connection.h | 1 + src/Evaluate.cpp | 2 -- src/Execute.cpp | 17 +++++++++++++++++ src/Execute.h | 12 ++++++++++++ src/find_command.h | 3 ++- src/webkit_server.pro | 4 ++-- 10 files changed, 59 insertions(+), 11 deletions(-) create mode 100644 src/Execute.cpp create mode 100644 src/Execute.h diff --git a/lib/capybara/driver/webkit.rb b/lib/capybara/driver/webkit.rb index 9cc51cb..7193182 100644 --- a/lib/capybara/driver/webkit.rb +++ b/lib/capybara/driver/webkit.rb @@ -37,7 +37,7 @@ class Capybara::Driver::Webkit end def execute_script(script) - raise Capybara::NotSupportedByDriverError + browser.execute_script script end def evaluate_script(script) diff --git a/lib/capybara/driver/webkit/browser.rb b/lib/capybara/driver/webkit/browser.rb index 038d1ec..3f45a56 100644 --- a/lib/capybara/driver/webkit/browser.rb +++ b/lib/capybara/driver/webkit/browser.rb @@ -45,6 +45,10 @@ class Capybara::Driver::Webkit JSON.parse("[#{json}]").first end + def execute_script(script) + command('Execute', script) + end + private def start_server diff --git a/spec/driver_spec.rb b/spec/driver_spec.rb index 4a9851d..c8d0bfb 100644 --- a/spec/driver_spec.rb +++ b/spec/driver_spec.rb @@ -115,5 +115,15 @@ describe Capybara::Driver::Webkit 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 end diff --git a/src/Connection.cpp b/src/Connection.cpp index ae06f61..74f192e 100644 --- a/src/Connection.cpp +++ b/src/Connection.cpp @@ -7,6 +7,7 @@ #include "Url.h" #include "Source.h" #include "Evaluate.h" +#include "Execute.h" #include #include @@ -60,7 +61,8 @@ void Connection::processNext(const char *data) { if (m_command) { startCommand(); } else { - m_socket->write("bad command\n"); + QString failure = QString("Unknown command: ") + data + "\n"; + writeResponse(false, failure); } } } @@ -96,13 +98,16 @@ void Connection::finishCommand(bool success, QString &response) { m_command->deleteLater(); m_command = NULL; m_arguments.clear(); - if (success) { + writeResponse(success, response); +} + +void Connection::writeResponse(bool success, QString &response) { + if (success) m_socket->write("ok\n"); - } else { + else m_socket->write("failure\n"); - } + QString responseLength = QString::number(response.size()) + "\n"; m_socket->write(responseLength.toAscii()); m_socket->write(response.toAscii()); } - diff --git a/src/Connection.h b/src/Connection.h index 15f1d24..d68bd6f 100644 --- a/src/Connection.h +++ b/src/Connection.h @@ -22,6 +22,7 @@ class Connection : public QObject { Command *createCommand(const char *name); void startCommand(); void continueCommand(const char *line); + void writeResponse(bool success, QString &response); QTcpSocket *m_socket; Command *m_command; diff --git a/src/Evaluate.cpp b/src/Evaluate.cpp index 94654ee..53699d5 100644 --- a/src/Evaluate.cpp +++ b/src/Evaluate.cpp @@ -7,8 +7,6 @@ Evaluate::Evaluate(WebPage *page, QObject *parent) : Command(page, parent) { } void Evaluate::start(QStringList &arguments) { - Q_UNUSED(arguments); - QVariant result = page()->mainFrame()->evaluateJavaScript(arguments[0]); addVariant(result); emit finished(true, m_buffer); diff --git a/src/Execute.cpp b/src/Execute.cpp new file mode 100644 index 0000000..4845b77 --- /dev/null +++ b/src/Execute.cpp @@ -0,0 +1,17 @@ +#include "Execute.h" +#include "WebPage.h" + +Execute::Execute(WebPage *page, QObject *parent) : Command(page, parent) { +} + +void Execute::start(QStringList &arguments) { + QVariant result = page()->mainFrame()->evaluateJavaScript(arguments[0]); + QString response; + if (result.isValid()) { + emit finished(true, response); + } else { + response = "Javascript failed to execute"; + emit finished(false, response); + } +} + diff --git a/src/Execute.h b/src/Execute.h new file mode 100644 index 0000000..b76a092 --- /dev/null +++ b/src/Execute.h @@ -0,0 +1,12 @@ +#include "Command.h" + +class WebPage; + +class Execute : public Command { + Q_OBJECT + + public: + Execute(WebPage *page, QObject *parent = 0); + virtual void start(QStringList &arguments); +}; + diff --git a/src/find_command.h b/src/find_command.h index be639f8..b38ad33 100644 --- a/src/find_command.h +++ b/src/find_command.h @@ -9,4 +9,5 @@ CHECK_COMMAND(Reset) CHECK_COMMAND(Node) CHECK_COMMAND(Url) CHECK_COMMAND(Source) -CHECK_COMMAND(Evaluate) \ No newline at end of file +CHECK_COMMAND(Evaluate) +CHECK_COMMAND(Execute) diff --git a/src/webkit_server.pro b/src/webkit_server.pro index 1ea9283..8079223 100644 --- a/src/webkit_server.pro +++ b/src/webkit_server.pro @@ -1,8 +1,8 @@ TEMPLATE = app TARGET = webkit_server DESTDIR = . -HEADERS = WebPage.h Server.h Connection.h Command.h Visit.h Find.h Reset.h Node.h JavascriptInvocation.h Url.h Source.h Evaluate.h -SOURCES = main.cpp WebPage.cpp Server.cpp Connection.cpp Command.cpp Visit.cpp Find.cpp Reset.cpp Node.cpp JavascriptInvocation.cpp Url.cpp Source.cpp Evaluate.cpp +HEADERS = WebPage.h Server.h Connection.h Command.h Visit.h Find.h Reset.h Node.h JavascriptInvocation.h Url.h Source.h Evaluate.h Execute.h +SOURCES = main.cpp WebPage.cpp Server.cpp Connection.cpp Command.cpp Visit.cpp Find.cpp Reset.cpp Node.cpp JavascriptInvocation.cpp Url.cpp Source.cpp Evaluate.cpp Execute.cpp RESOURCES = webkit_server.qrc QT += network webkit CONFIG += console