diff --git a/lib/capybara/driver/webkit.rb b/lib/capybara/driver/webkit.rb index a9ee32e..432f1cf 100644 --- a/lib/capybara/driver/webkit.rb +++ b/lib/capybara/driver/webkit.rb @@ -59,6 +59,14 @@ class Capybara::Driver::Webkit browser.evaluate_script script end + def console_messages + browser.console_messages + end + + def error_messages + browser.error_messages + end + def response_headers browser.response_headers end diff --git a/lib/capybara/driver/webkit/browser.rb b/lib/capybara/driver/webkit/browser.rb index bb77f50..6cfdede 100644 --- a/lib/capybara/driver/webkit/browser.rb +++ b/lib/capybara/driver/webkit/browser.rb @@ -45,6 +45,19 @@ class Capybara::Driver::Webkit command("Status").to_i end + def console_messages + command("ConsoleMessages").split("\n").map do |messages| + parts = messages.split("|", 3) + { source: parts.first, line_number: Integer(parts[1]), message: parts.last } + end + end + + def error_messages + console_messages.select do |message| + message[:message] =~ /Error:/ + end + end + def response_headers Hash[command("Headers").split("\n").map { |header| header.split(": ") }] end diff --git a/spec/driver_spec.rb b/spec/driver_spec.rb index 79be5d3..23ea65b 100644 --- a/spec/driver_spec.rb +++ b/spec/driver_spec.rb @@ -320,6 +320,42 @@ describe Capybara::Driver::Webkit do end end + context "console messages app" do + + before(:all) do + @app = lambda do |env| + puts "running" + body = <<-HTML + + + + + + + + HTML + [200, + { 'Content-Type' => 'text/html', 'Content-Length' => body.length.to_s }, + [body]] + end + end + + it "collects messages logged to the console" do + puts subject.console_messages.inspect + subject.console_messages.first.should include :source, message: "hello", line_number: 6 + subject.console_messages.length.should eq 3 + end + + it "logs errors to the console" do + subject.error_messages.length.should eq 1 + end + + end + context "form app" do before(:all) do @app = lambda do |env| diff --git a/src/CommandFactory.cpp b/src/CommandFactory.cpp index dc7df06..ed4782a 100644 --- a/src/CommandFactory.cpp +++ b/src/CommandFactory.cpp @@ -18,6 +18,7 @@ #include "ClearCookies.h" #include "GetCookies.h" #include "SetProxy.h" +#include "ConsoleMessages.h" CommandFactory::CommandFactory(WebPage *page, QObject *parent) : QObject(parent) { m_page = page; diff --git a/src/ConsoleMessages.cpp b/src/ConsoleMessages.cpp new file mode 100644 index 0000000..5756eee --- /dev/null +++ b/src/ConsoleMessages.cpp @@ -0,0 +1,11 @@ +#include "ConsoleMessages.h" +#include "WebPage.h" + +ConsoleMessages::ConsoleMessages(WebPage *page, QObject *parent) : Command(page, parent) { +} + +void ConsoleMessages::start(QStringList &arguments) { + Q_UNUSED(arguments); + emit finished(new Response(true, page()->consoleMessages())); +} + diff --git a/src/ConsoleMessages.h b/src/ConsoleMessages.h new file mode 100644 index 0000000..37dd1f5 --- /dev/null +++ b/src/ConsoleMessages.h @@ -0,0 +1,12 @@ +#include "Command.h" + +class WebPage; + +class ConsoleMessages : public Command { + Q_OBJECT + + public: + ConsoleMessages(WebPage *page, QObject *parent = 0); + virtual void start(QStringList &arguments); +}; + diff --git a/src/Reset.cpp b/src/Reset.cpp index c4de016..e3fd01e 100644 --- a/src/Reset.cpp +++ b/src/Reset.cpp @@ -15,6 +15,7 @@ void Reset::start(QStringList &arguments) { page()->setCustomNetworkAccessManager(); page()->setUserAgent(NULL); page()->resetResponseHeaders(); + page()->resetConsoleMessages(); emit finished(new Response(true)); } diff --git a/src/WebPage.cpp b/src/WebPage.cpp index 3127afd..67275b1 100644 --- a/src/WebPage.cpp +++ b/src/WebPage.cpp @@ -58,6 +58,10 @@ QString WebPage::userAgentForUrl(const QUrl &url ) const { } } +QString WebPage::consoleMessages() { + return m_consoleMessages.join("\n"); +} + void WebPage::setUserAgent(QString userAgent) { m_userAgent = userAgent; } @@ -90,9 +94,11 @@ QVariant WebPage::invokeCapybaraFunction(QString &name, QStringList &arguments) } void WebPage::javaScriptConsoleMessage(const QString &message, int lineNumber, const QString &sourceID) { + QString fullMessage = QString::number(lineNumber) + "|" + message; if (!sourceID.isEmpty()) - std::cout << qPrintable(sourceID) << ":" << lineNumber << " "; - std::cout << qPrintable(message) << std::endl; + fullMessage = sourceID + "|" + fullMessage; + m_consoleMessages.append(fullMessage); + std::cout << qPrintable(fullMessage) << std::endl; } void WebPage::javaScriptAlert(QWebFrame *frame, const QString &message) { @@ -217,6 +223,10 @@ void WebPage::resetResponseHeaders() { m_pageHeaders = QString(); } +void WebPage::resetConsoleMessages() { + m_consoleMessages.clear(); +} + QString WebPage::pageHeaders() { return m_pageHeaders; } diff --git a/src/WebPage.h b/src/WebPage.h index 79a50d2..f006a34 100644 --- a/src/WebPage.h +++ b/src/WebPage.h @@ -17,6 +17,8 @@ class WebPage : public QWebPage { virtual bool extension (Extension extension, const ExtensionOption *option=0, ExtensionReturn *output=0); void setIgnoreSslErrors(bool ignore); bool ignoreSslErrors(); + QString consoleMessages(); + void resetConsoleMessages(); public slots: bool shouldInterruptJavaScript(); @@ -50,5 +52,6 @@ class WebPage : public QWebPage { int m_lastStatus; QString m_pageHeaders; bool m_ignoreSslErrors; + QStringList m_consoleMessages; }; diff --git a/src/find_command.h b/src/find_command.h index 3215c95..23681ca 100644 --- a/src/find_command.h +++ b/src/find_command.h @@ -22,3 +22,4 @@ CHECK_COMMAND(ClearCookies) CHECK_COMMAND(GetCookies) CHECK_COMMAND(Headers) CHECK_COMMAND(SetProxy) +CHECK_COMMAND(ConsoleMessages) \ No newline at end of file diff --git a/src/webkit_server.pro b/src/webkit_server.pro index 37e7b61..3e0ab5d 100644 --- a/src/webkit_server.pro +++ b/src/webkit_server.pro @@ -2,6 +2,7 @@ TEMPLATE = app TARGET = webkit_server DESTDIR = . HEADERS = \ + ConsoleMessages.h \ WebPage.h \ Server.h \ Connection.h \ @@ -33,6 +34,7 @@ HEADERS = \ SetProxy.h \ SOURCES = \ + ConsoleMessages.cpp \ main.cpp \ WebPage.cpp \ Server.cpp \