Save a screenshot when raising a ClickFailed exception

* Prints the path to the file
* Make it easier to debug what was actually clicked
This commit is contained in:
Joe Ferris and Matt Horan 2013-11-09 14:34:43 -05:00 committed by Joe Ferris
parent 0f89db1825
commit 76a362c664
4 changed files with 21 additions and 5 deletions

View File

@ -415,12 +415,15 @@ describe Capybara::Session do
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

View File

@ -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;
}

View File

@ -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 File

@ -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;