new command: timeout-false
This commit is contained in:
		| @@ -9,8 +9,8 @@ | ||||
| # change this: | ||||
| m4_define(x_package_name, webtester) # project's name | ||||
| m4_define(x_major, 3) # project's major version | ||||
| m4_define(x_minor, 0) # project's minor version | ||||
| m4_define(x_least_diff, 123) | ||||
| m4_define(x_minor, 1) # project's minor version | ||||
| m4_define(x_least_diff, 129) | ||||
|  | ||||
| # never edit this block: | ||||
| m4_include(ax_init_standard_project.m4) | ||||
|   | ||||
| @@ -25,7 +25,7 @@ | ||||
| ;;   echo $(webrunner -h | sed -n 's,  COMMAND: ,,p') | sed 's, ,\\\\|,g' | ||||
| (defconst wt-font-lock-keywords | ||||
|   (list | ||||
|    '("^ *\\(auth\\|ca-certificate\\|call\\|case\\|default\\|check\\|clear-cookies\\|click\\|clicktype\\|client-certificate\\|do\\|download\\|echo\\|execute\\|exists\\|exit\\|expect\\|fail\\|for\\|function\\|if\\|else\\|while\\|ignore\\|unignore\\|ignoreto\\|include\\|label\\|load\\|not\\|offline-storage-path\\|open\\|screenshot\\|set\\|setvalue\\|sleep\\|testcase\\|testsuite\\|timeout\\|unset\\|upload\\)\\b" . font-lock-builtin-face) | ||||
|    '("^ *\\(auth\\|ca-certificate\\|call\\|case\\|default\\|check\\|clear-cookies\\|click\\|clicktype\\|client-certificate\\|do\\|download\\|echo\\|execute\\|exists\\|exit\\|expect\\|fail\\|for\\|function\\|if\\|else\\|while\\|ignore\\|unignore\\|ignoreto\\|include\\|label\\|load\\|not\\|offline-storage-path\\|open\\|screenshot\\|set\\|setvalue\\|sleep\\|testcase\\|testsuite\\|timeout\\|timeout-false\\|unset\\|upload\\)\\b" . font-lock-builtin-face) | ||||
|    '("^ *#.*$" . font-lock-comment-face)) | ||||
|   "Highlighting expressions for Webtester") | ||||
|  | ||||
|   | ||||
| @@ -495,7 +495,9 @@ class Script: public QObject { | ||||
|   public: | ||||
|     Script(): | ||||
|         _step(0), _clicktype(JAVASCRIPT_CLICK), | ||||
|         _screenshots(true), _defaultTimeout(20) { | ||||
|         _screenshots(true), | ||||
|         _defaultTimeout(10), | ||||
|         _defaultTimeoutFalse(3) { | ||||
|       initPrototypes(); | ||||
|     } | ||||
|     Script(const Script& o): | ||||
| @@ -599,6 +601,7 @@ class Script: public QObject { | ||||
|       _variables.clear(); | ||||
|       _rvariables.clear(); | ||||
|       _timeout = _defaultTimeout; | ||||
|       _timeoutFalse = _defaultTimeoutFalse; | ||||
|       _step = 0; | ||||
|       _clicktype = JAVASCRIPT_CLICK; | ||||
|     } | ||||
| @@ -651,7 +654,8 @@ class Script: public QObject { | ||||
|       bool res(true); | ||||
|       _step = 0; | ||||
|       _testsuites = testsuites; | ||||
|       _timeout = _defaultTimeout; // defaults to 20s | ||||
|       _timeout = _defaultTimeout; | ||||
|       _timeoutFalse = _defaultTimeoutFalse; | ||||
|       _ignoreSignalsUntil.clear(); | ||||
|       addSignals(frame); | ||||
|       _screenshots = screenshots; | ||||
| @@ -929,7 +933,9 @@ class Script: public QObject { | ||||
|       _variables = o._variables; | ||||
|       _rvariables = o._rvariables; | ||||
|       _timeout = o._timeout; | ||||
|       _timeoutFalse = o._timeoutFalse; | ||||
|       _defaultTimeout = o._timeout; | ||||
|       _defaultTimeoutFalse = o._timeoutFalse; | ||||
|       _clicktype = o._clicktype; | ||||
|       _testsuites = o._testsuites; | ||||
|       _testclass = o._testclass; | ||||
| @@ -965,9 +971,18 @@ class Script: public QObject { | ||||
|     int timeout() { | ||||
|       return _timeout; | ||||
|     } | ||||
|     void timeoutFalse(int t) { | ||||
|       _timeoutFalse = t; | ||||
|     } | ||||
|     int timeoutFalse() { | ||||
|       return _timeoutFalse; | ||||
|     } | ||||
|     void defaultTimeout(int t) { | ||||
|       _defaultTimeout = t; | ||||
|     } | ||||
|     void defaultTimeoutFalse(int t) { | ||||
|       _defaultTimeoutFalse = t; | ||||
|     } | ||||
|     void auth(const QString& realm, const QString& username, const QString& password) { | ||||
|       if (!username.isEmpty() && !password.isEmpty()) | ||||
|         _auth[realm] = {username, password}; | ||||
| @@ -1202,7 +1217,9 @@ class Script: public QObject { | ||||
|     QMap<LenString, LenString> _rvariables; ///< reverse variable mapping | ||||
|     QMap<QString, std::shared_ptr<Function> > _functions; | ||||
|     int _timeout; | ||||
|     int _timeoutFalse; | ||||
|     int _defaultTimeout; | ||||
|     int _defaultTimeoutFalse; | ||||
|     ClickType _clicktype; | ||||
|     QString _targetdir; | ||||
|     std::shared_ptr<xml::Node> _testsuites; ///< only valid within run | ||||
| @@ -1664,8 +1681,7 @@ class Not: public Command { | ||||
|       Logger log(this, script); | ||||
|       QString selector(script->replacevars(_selector)); | ||||
|       QString text(script->replacevars(_text)); | ||||
|       QWebElement firstelement(find(frame, selector, | ||||
|                                     mrw::max(mrw::min(script->timeout()/3, 10), 2))); | ||||
|       QWebElement firstelement(find(frame, selector, script->timeoutFalse()-1)); | ||||
|       for (QWebElement element: frame->findAllElements(selector)) { | ||||
|         if (text.isEmpty()) | ||||
|           error(log, AssertionFailed("element must not exists: "+selector)); | ||||
| @@ -1979,7 +1995,7 @@ class Timeout: public Command { | ||||
|       return | ||||
|         tag()+" <seconds>" | ||||
|         "\n\n--\n\n" | ||||
|         "Set the timeout in seconds (defaults to 10)."; | ||||
|         "Set the timeout in seconds."; | ||||
|     } | ||||
|     QString command() const { | ||||
|       return tag()+" "+_timeout; | ||||
| @@ -1997,6 +2013,47 @@ class Timeout: public Command { | ||||
|       if (!ok) error(log, BadArgument(script->replacevars(_timeout) | ||||
|                                       +" should be a number of seconds")); | ||||
|       script->timeout(timeout); | ||||
|       script->defaultTimeout(timeout); | ||||
|       return true; | ||||
|     } | ||||
|   private: | ||||
|     QString _timeout; | ||||
| }; | ||||
|  | ||||
| class TimeoutFalse: public Command { | ||||
|   public: | ||||
|     QString tag() const { | ||||
|       return "timeout-false"; | ||||
|     } | ||||
|     QString description() const { | ||||
|       return | ||||
|         tag()+" <seconds>" | ||||
|         "\n\n--\n\n" | ||||
|         "Set the timeout for negative testcases in seconds." | ||||
|         " Time to wait until a negative testcase is accepted. It is used in" | ||||
|         " commands such as not, if or while, where a fail is the expected or at" | ||||
|         " least a valid result. Normally, this timeout can be lower than the" | ||||
|         " normal timeout. This is, because to verify that something does not" | ||||
|         " exists, the test run has always to wait for the full timeout. So" | ||||
|         " setting this to a lower value increases the speed of the test run."; | ||||
|     } | ||||
|     QString command() const { | ||||
|       return tag()+" "+_timeout; | ||||
|     } | ||||
|     std::shared_ptr<Command> parse(Script*, QString args, | ||||
|                                    QStringList&, QString, int, int) { | ||||
|       std::shared_ptr<TimeoutFalse> cmd(new TimeoutFalse()); | ||||
|       cmd->_timeout = args; | ||||
|       return cmd; | ||||
|     } | ||||
|     bool execute(Script* script, QWebFrame*) { | ||||
|       Logger log(this, script); | ||||
|       bool ok; | ||||
|       int timeout(script->replacevars(_timeout).toInt(&ok)); | ||||
|       if (!ok) error(log, BadArgument(script->replacevars(_timeout) | ||||
|                                       +" should be a number of seconds")); | ||||
|       script->timeoutFalse(timeout); | ||||
|       script->defaultTimeoutFalse(timeout); | ||||
|       return true; | ||||
|     } | ||||
|   private: | ||||
| @@ -2371,8 +2428,7 @@ class If: public CommandContainer { | ||||
|       QString selector(script->replacevars(_variable)); | ||||
|       bool check(false); | ||||
|       if (_cmp=="->") { | ||||
|         QWebElement firstelement(find(frame, selector, | ||||
|                                       mrw::max(mrw::min(script->timeout()/3, 10), 2))); | ||||
|         QWebElement firstelement(find(frame, selector, script->timeoutFalse()-1)); | ||||
|         for (QWebElement element: frame->findAllElements(selector)) { | ||||
|           if (value.isEmpty() || // just find element | ||||
|               element.toOuterXml().indexOf(value)!=-1 || | ||||
| @@ -2478,8 +2534,7 @@ class While: public CommandContainer { | ||||
|       for (bool check(true); check;) { | ||||
|         if (_cmp=="->") { | ||||
|           check = false; | ||||
|           QWebElement firstelement(find(frame, selector, | ||||
|                                         mrw::max(mrw::min(script->timeout()/3, 10), 2))); | ||||
|           QWebElement firstelement(find(frame, selector, script->timeoutFalse()-1)); | ||||
|           for (QWebElement element: frame->findAllElements(selector)) { | ||||
|             if (value.isEmpty() || // just find element | ||||
|                 element.toOuterXml().indexOf(value)!=-1 || | ||||
| @@ -2942,8 +2997,7 @@ class Case: public Command { | ||||
|           log("terminate with default branch"); | ||||
|           check = true; | ||||
|         } else if (condition.cmp=="->") { | ||||
|           QWebElement firstelement(find(frame, selector, | ||||
|                                         mrw::max(mrw::min(script->timeout()/3, 10), 2))); | ||||
|           QWebElement firstelement(find(frame, selector, script->timeoutFalse()-1)); | ||||
|           for (QWebElement element: frame->findAllElements(selector)) { | ||||
|             if (value.isEmpty() || // just find element | ||||
|                 element.toOuterXml().indexOf(value)!=-1 || | ||||
| @@ -3283,6 +3337,7 @@ inline void Script::initPrototypes() { | ||||
|   add(new Set); | ||||
|   add(new UnSet); | ||||
|   add(new Timeout); | ||||
|   add(new TimeoutFalse); | ||||
|   add(new CaCertificate); | ||||
|   add(new ClientCertificate); | ||||
|   add(new ::ClickType); | ||||
|   | ||||
| @@ -19,7 +19,7 @@ class Highlighter: public QSyntaxHighlighter { | ||||
|     void include(QString); | ||||
|   public: | ||||
|     Highlighter(QTextDocument *parent): QSyntaxHighlighter(parent) { | ||||
|       QString commands="auth|ca-certificate|call|case|default|check|clear-cookies|click|clicktype|client-certificate|do|download|echo|execute|exists|exit|expect|fail|for|function|if|else|while|ignore|unignore|ignoreto|include|label|load|not|offline-storage-path|open|screenshot|set|setvalue|sleep|testcase|testsuite|timeout|unset|upload"; | ||||
|       QString commands="auth|ca-certificate|call|case|default|check|clear-cookies|click|clicktype|client-certificate|do|download|echo|execute|exists|exit|expect|fail|for|function|if|else|while|ignore|unignore|ignoreto|include|label|load|not|offline-storage-path|open|screenshot|set|setvalue|sleep|testcase|testsuite|timeout|timeout-false|unset|upload"; | ||||
|       _expressions<<Expression("^ *("+commands+")\\b").weight(QFont::Bold).fg(Qt::darkBlue) | ||||
|                   <<Expression("^ *#.*$").weight(QFont::Bold).fg(Qt::black); | ||||
|     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user