Skip to content

Commit 79e2618

Browse files
committed
added timeouts command
1 parent 6c2d286 commit 79e2618

File tree

9 files changed

+107
-22
lines changed

9 files changed

+107
-22
lines changed

inc/commands/set_timeout_commands.h

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ namespace webdriver {
1818

1919
class Response;
2020

21+
/// Set the amount of time that a particular type of operation can execute (/session/*/timeouts").
22+
/// Valid values are: "script" for script timeouts,
23+
/// "implicit" for modifying the implicit wait timeout
24+
/// and "page load" for setting a page load timeout.
25+
/// E.g. - {"ms": 2000, "type": "page load"}
26+
2127
class SetTimeoutCommand : public WebDriverCommand {
2228
public:
2329
SetTimeoutCommand(const std::vector<std::string>& path_segments,
@@ -26,9 +32,13 @@ class SetTimeoutCommand : public WebDriverCommand {
2632

2733
virtual bool DoesPost() const OVERRIDE;
2834
virtual void ExecutePost(Response* const response) OVERRIDE;
29-
virtual void SetTimeout(int timeout_ms) = 0;
35+
virtual Error* SetTimeout(int timeout_ms);
36+
37+
/// Amount of time of operation can execute (/session/*/timeouts") by default, in ms.
38+
static const int DEFAULT_TIMEOUT;
3039

3140
private:
41+
Error* SetTimeout(int timeout_ms, std::string type);
3242
DISALLOW_COPY_AND_ASSIGN(SetTimeoutCommand);
3343
};
3444

@@ -38,7 +48,7 @@ class SetAsyncScriptTimeoutCommand : public SetTimeoutCommand {
3848
SetAsyncScriptTimeoutCommand(const std::vector<std::string>& path_segments,
3949
const base::DictionaryValue* const parameters);
4050
virtual ~SetAsyncScriptTimeoutCommand();
41-
virtual void SetTimeout(int timeout_ms) OVERRIDE;
51+
virtual Error* SetTimeout(int timeout_ms) OVERRIDE;
4252

4353
private:
4454
DISALLOW_COPY_AND_ASSIGN(SetAsyncScriptTimeoutCommand);
@@ -50,7 +60,7 @@ class ImplicitWaitCommand : public SetTimeoutCommand {
5060
ImplicitWaitCommand(const std::vector<std::string>& path_segments,
5161
const base::DictionaryValue* const parameters);
5262
virtual ~ImplicitWaitCommand();
53-
virtual void SetTimeout(int timeout_ms) OVERRIDE;
63+
virtual Error* SetTimeout(int timeout_ms) OVERRIDE;
5464

5565
private:
5666
DISALLOW_COPY_AND_ASSIGN(ImplicitWaitCommand);

inc/webdriver_route_patterns.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class CommandRoutes {
2323
static const char kNewSession[];
2424
static const char kSession[];
2525
static const char kSessions[];
26+
static const char kTimeOuts[];
2627
static const char kImplicitlyWait[];
2728
static const char kSetScriptTimeout[];
2829
static const char kGetAvailableLogTypes[];

inc/webdriver_route_table.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
/// - kNewSession[] = "/session";
3838
/// - kSession[] = "/session/*";
3939
/// - kSessions[] = "/sessions";
40+
/// - kTimeOuts[] = "/session/*/timeouts";
4041
/// - kImplicitlyWait[] = "/session/*/timeouts/implicit_wait";
4142
/// - kSetScriptTimeout[] = "/session/*/timeouts/async_script";
4243
/// - kGetAvailableLogTypes[] = "/session/*/log/types";

inc/webdriver_session.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@ class Session {
125125

126126
void set_current_view(const ViewId& viewId);
127127

128+
void set_page_load_timeout(int timeout_ms);
129+
int page_load_timeout() const;
130+
128131
void set_async_script_timeout(int timeout_ms);
129132
int async_script_timeout() const;
130133

@@ -240,6 +243,9 @@ class Session {
240243

241244
base::Thread thread_;
242245

246+
// Timeout (in ms) for page loads.
247+
int page_load_timeout_;
248+
243249
// Timeout (in ms) for asynchronous script execution.
244250
int async_script_timeout_;
245251

src/webdriver/commands/set_timeout_commands.cc

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
namespace webdriver {
1616

17+
const int SetTimeoutCommand::DEFAULT_TIMEOUT = 60000;
18+
1719
SetTimeoutCommand::SetTimeoutCommand(
1820
const std::vector<std::string>& path_segments,
1921
const DictionaryValue* const parameters) :
@@ -49,13 +51,53 @@ void SetTimeoutCommand::ExecutePost(Response* const response) {
4951
ms_to_wait = static_cast<int>(ms);
5052
}
5153

52-
// Validate the wait time before setting it to the session.
53-
if (ms_to_wait < 0) {
54-
response->SetError(new Error(kBadRequest, "Timeout must be non-negative"));
54+
Error* error = NULL;
55+
scoped_ptr<Error> err(error);
56+
57+
// Timeout type as string
58+
const char kTimeoutTypeKey[] = "type";
59+
std::string type_of_operation;
60+
if (!HasParameter(kTimeoutTypeKey)) {
61+
error = SetTimeout(ms_to_wait);
62+
if (error)
63+
response->SetError(error);
5564
return;
5665
}
66+
if (!GetStringParameter(kTimeoutTypeKey, &type_of_operation)) {
67+
response->SetError(new Error(
68+
kBadRequest, "'type' parameter must be a string"));
69+
return;
70+
}
71+
error = SetTimeout(ms_to_wait, type_of_operation);
72+
if (error)
73+
response->SetError(error);
74+
}
5775

58-
SetTimeout(ms_to_wait);
76+
Error* SetTimeoutCommand::SetTimeout(int timeout_ms) {
77+
return new Error(kUnknownError, "Request missing 'type' parameter");
78+
}
79+
80+
Error* SetTimeoutCommand::SetTimeout(int timeout_ms, std::string type) {
81+
if (!type.compare("implicit")) {
82+
// timeouts value has a lower bound of 0 for implicit wait.
83+
if (timeout_ms < 0)
84+
return new Error(kUnknownError, "Timeout for implicit wait must be non-negative");
85+
session_->set_implicit_wait(timeout_ms);
86+
return NULL;
87+
} else {
88+
// Validate the wait time before setting it to the session.
89+
if (timeout_ms < 0)
90+
timeout_ms = DEFAULT_TIMEOUT;
91+
if (!type.compare("page load")) {
92+
session_->set_page_load_timeout(timeout_ms);
93+
return NULL;
94+
} else if (!type.compare("script")) {
95+
session_->set_async_script_timeout(timeout_ms);
96+
return NULL;
97+
} else {
98+
return new Error(kUnknownError, "Unknown type of timeout:" + type);
99+
}
100+
}
59101
}
60102

61103
SetAsyncScriptTimeoutCommand::SetAsyncScriptTimeoutCommand(
@@ -65,8 +107,11 @@ SetAsyncScriptTimeoutCommand::SetAsyncScriptTimeoutCommand(
65107

66108
SetAsyncScriptTimeoutCommand::~SetAsyncScriptTimeoutCommand() {}
67109

68-
void SetAsyncScriptTimeoutCommand::SetTimeout(int timeout_ms) {
110+
Error* SetAsyncScriptTimeoutCommand::SetTimeout(int timeout_ms) {
111+
if (timeout_ms < 0)
112+
timeout_ms = DEFAULT_TIMEOUT;
69113
session_->set_async_script_timeout(timeout_ms);
114+
return NULL;
70115
}
71116

72117
ImplicitWaitCommand::ImplicitWaitCommand(
@@ -76,8 +121,12 @@ ImplicitWaitCommand::ImplicitWaitCommand(
76121

77122
ImplicitWaitCommand::~ImplicitWaitCommand() {}
78123

79-
void ImplicitWaitCommand::SetTimeout(int timeout_ms) {
124+
Error* ImplicitWaitCommand::SetTimeout(int timeout_ms) {
125+
// timeouts value has a lower bound of 0 for implicit wait.
126+
if (timeout_ms < 0)
127+
return new Error(kUnknownError, "Timeout for implicit wait must be non-negative");
80128
session_->set_implicit_wait(timeout_ms);
129+
return NULL;
81130
}
82131

83132
} // namespace webdriver

src/webdriver/extension_qt/qwebkit_proxy.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -623,6 +623,7 @@ Error* QWebkitProxy::SwitchToTopFrameIfCurrentFrameInvalid() {
623623
Error* QWebkitProxy::NavigateToURL(const std::string& url, bool sync) {
624624
QUrl address(QString(url.c_str()));
625625

626+
base::Time start_time = base::Time::Now();
626627
if (sync) {
627628
QPageLoader pageLoader(page_);
628629
QEventLoop loop;
@@ -636,6 +637,10 @@ Error* QWebkitProxy::NavigateToURL(const std::string& url, bool sync) {
636637
} else {
637638
page_->mainFrame()->load(address);
638639
}
640+
if ((base::Time::Now() - start_time).InMilliseconds() > session_->page_load_timeout()) {
641+
return new Error(kTimeout, "page loading timed out");
642+
}
643+
639644

640645
return NULL;
641646
}

src/webdriver/webdriver_route_patterns.cc

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ bool CommandRoutes::IsStandardRoute(const std::string& pattern) {
1414
standardCommandRoutes.insert(kNewSession);
1515
standardCommandRoutes.insert(kSession);
1616
standardCommandRoutes.insert(kSessions);
17+
standardCommandRoutes.insert(kTimeOuts);
1718
standardCommandRoutes.insert(kImplicitlyWait);
1819
standardCommandRoutes.insert(kSetScriptTimeout);
1920
standardCommandRoutes.insert(kGetAvailableLogTypes);
@@ -76,20 +77,20 @@ bool CommandRoutes::IsStandardRoute(const std::string& pattern) {
7677
standardCommandRoutes.insert(kSessionStorageKey);
7778
standardCommandRoutes.insert(kSessionStorageSize);
7879
standardCommandRoutes.insert(kGetLocation);
79-
standardCommandRoutes.insert(kTouchClick);
80-
standardCommandRoutes.insert(kTouchDown);
81-
standardCommandRoutes.insert(kTouchUp);
82-
standardCommandRoutes.insert(kTouchMove);
83-
standardCommandRoutes.insert(kTouchScroll);
84-
standardCommandRoutes.insert(kTouchDoubleClick);
85-
standardCommandRoutes.insert(kTouchLongClick);
86-
standardCommandRoutes.insert(kTouchFlick);
87-
standardCommandRoutes.insert(kOrientation);
80+
standardCommandRoutes.insert(kTouchClick);
81+
standardCommandRoutes.insert(kTouchDown);
82+
standardCommandRoutes.insert(kTouchUp);
83+
standardCommandRoutes.insert(kTouchMove);
84+
standardCommandRoutes.insert(kTouchScroll);
85+
standardCommandRoutes.insert(kTouchDoubleClick);
86+
standardCommandRoutes.insert(kTouchLongClick);
87+
standardCommandRoutes.insert(kTouchFlick);
88+
standardCommandRoutes.insert(kOrientation);
8889
standardCommandRoutes.insert(kXdrpc);
89-
standardCommandRoutes.insert(kCiscoPlayerState);
90-
standardCommandRoutes.insert(kCiscoPlayerVolume);
91-
standardCommandRoutes.insert(kCiscoPlayingPosition);
92-
standardCommandRoutes.insert(kShutdown);
90+
standardCommandRoutes.insert(kCiscoPlayerState);
91+
standardCommandRoutes.insert(kCiscoPlayerVolume);
92+
standardCommandRoutes.insert(kCiscoPlayingPosition);
93+
standardCommandRoutes.insert(kShutdown);
9394
}
9495

9596
// check if paatern is presence in set
@@ -103,6 +104,7 @@ const char CommandRoutes::kGetLog[] = "/log";
103104
const char CommandRoutes::kNewSession[] = "/session";
104105
const char CommandRoutes::kSession[] = "/session/*";
105106
const char CommandRoutes::kSessions[] = "/sessions";
107+
const char CommandRoutes::kTimeOuts[] = "/session/*/timeouts";
106108
const char CommandRoutes::kImplicitlyWait[] = "/session/*/timeouts/implicit_wait";
107109
const char CommandRoutes::kSetScriptTimeout[] = "/session/*/timeouts/async_script";
108110
const char CommandRoutes::kGetAvailableLogTypes[] = "/session/*/log/types";

src/webdriver/webdriver_route_table.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ DefaultRouteTable::DefaultRouteTable()
238238
Add<CreateSession> (CommandRoutes::kNewSession);
239239
Add<SessionWithID> (CommandRoutes::kSession);
240240
Add<Sessions> (CommandRoutes::kSessions);
241+
Add<SetTimeoutCommand> (CommandRoutes::kTimeOuts);
241242
Add<SetAsyncScriptTimeoutCommand> (CommandRoutes::kSetScriptTimeout);
242243
Add<ImplicitWaitCommand> (CommandRoutes::kImplicitlyWait);
243244
Add<LogTypesCommand> (CommandRoutes::kGetAvailableLogTypes);

src/webdriver/webdriver_session.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include "webdriver_view_runner.h"
3131
#include "webdriver_util.h"
3232
#include "webdriver_view_executor.h"
33+
#include "commands/set_timeout_commands.h"
3334

3435
#if !defined(OS_WIN)
3536
#include <sys/types.h>
@@ -45,6 +46,7 @@ Session::Session()
4546
current_view_id_(ViewId()),
4647
current_frame_path_(FramePath()),
4748
thread_(id_.c_str()),
49+
page_load_timeout_(SetTimeoutCommand::DEFAULT_TIMEOUT),
4850
async_script_timeout_(0),
4951
implicit_wait_(0),
5052
desired_caps_(NULL),
@@ -348,6 +350,14 @@ void Session::set_current_view(const ViewId& viewId) {
348350
current_view_id_ = viewId;
349351
}
350352

353+
void Session::set_page_load_timeout(int timeout_ms) {
354+
page_load_timeout_ = timeout_ms;
355+
}
356+
357+
int Session::page_load_timeout() const {
358+
return page_load_timeout_;
359+
}
360+
351361
void Session::set_async_script_timeout(int timeout_ms) {
352362
async_script_timeout_ = timeout_ms;
353363
}

0 commit comments

Comments
 (0)