Permalink
Browse files

Save a screenshot when raising a ClickFailed exception

* Prints the path to the file
* Make it easier to debug what was actually clicked
  • Loading branch information...
1 parent 0f89db1 commit 76a362c66462634ad8d21eb964f5bb8dd7319205 Joe Ferris and Matt Horan committed with jferris Nov 9, 2013
Showing with 21 additions and 5 deletions.
  1. +8 −5 spec/integration/session_spec.rb
  2. +11 −0 src/JavascriptInvocation.cpp
  3. +1 −0 src/JavascriptInvocation.h
  4. +1 −0 src/capybara.js
@@ -415,12 +415,15 @@ module TestSessions
two.style.top = '0px';
JS
- lambda {
+ expect {
subject.find(:css, '#one').click
- }.should raise_error(
- Capybara::Webkit::ClickFailed,
- /Failed.*\[@id='one'\].*overlapping.*\[@id='two'\].*at position/
- )
+ }.to raise_error(Capybara::Webkit::ClickFailed) { |exception|
+ exception.message.should =~ %r{Failed.*\[@id='one'\].*overlapping.*\[@id='two'\].*at position}
+ screenshot_pattern = %r{A screenshot of the page at the time of the failure has been written to (.*)}
+ exception.message.should =~ screenshot_pattern
+ file = exception.message.match(screenshot_pattern)[1]
+ File.exist?(file).should be_true
+ }
end
it 'raises an error if a checkbox is obscured when checked' do
@@ -139,3 +139,14 @@ void JavascriptInvocation::keypress(QChar key) {
event = QKeyEvent(QKeyEvent::KeyRelease, keyCode, Qt::NoModifier, key);
QApplication::sendEvent(m_page, &event);
}
+
+const QString JavascriptInvocation::render(void) {
+ QString pathTemplate =
+ QDir::temp().absoluteFilePath("./click_failed_XXXXXX.png");
+ QTemporaryFile file(pathTemplate);
+ file.open();
+ file.setAutoRemove(false);
+ QString path = file.fileName();
+ m_page->render(path, QSize(1024, 768));
+ return path;
+}
@@ -24,6 +24,7 @@ class JavascriptInvocation : public QObject {
Q_INVOKABLE QVariantMap clickPosition(QWebElement element, int left, int top, int width, int height);
Q_INVOKABLE void hover(int absoluteX, int absoluteY);
Q_INVOKABLE void keypress(QChar);
+ Q_INVOKABLE const QString render(void);
QVariant getError();
void setError(QVariant error);
InvocationResult invoke(QWebFrame *);
View
@@ -376,6 +376,7 @@ Capybara.ClickFailed = function(expectedPath, actualPath, position) {
this.message += ' at position ' + position["absoluteX"] + ', ' + position["absoluteY"];
else
this.message += ' at unknown position';
+ this.message += "; \nA screenshot of the page at the time of the failure has been written to " + CapybaraInvocation.render();
};
Capybara.ClickFailed.prototype = new Error();
Capybara.ClickFailed.prototype.constructor = Capybara.ClickFailed;

0 comments on commit 76a362c

Please sign in to comment.