Commit 56d6c588 authored by John Chen's avatar John Chen Committed by Commit Bot

[ChromeDriver] Handle timeouts in session capabilities

Handle timeouts in session capabilities, according to W3C spec.

Bug: chromedriver:1997
Change-Id: Ie0c4bb8add482fa175f3bfe40210cf9fb0077001
Reviewed-on: https://chromium-review.googlesource.com/1243576Reviewed-by: default avatarCaleb Rouleau <crouleau@chromium.org>
Commit-Queue: John Chen <johnchen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#594097}
parent fa870596
...@@ -219,6 +219,30 @@ Status ParseUnhandledPromptBehavior(const base::Value& option, ...@@ -219,6 +219,30 @@ Status ParseUnhandledPromptBehavior(const base::Value& option,
return Status(kInvalidArgument, "invalid 'unhandledPromptBehavior'"); return Status(kInvalidArgument, "invalid 'unhandledPromptBehavior'");
} }
Status ParseTimeouts(const base::Value& option, Capabilities* capabilities) {
const base::DictionaryValue* timeouts;
if (!option.GetAsDictionary(&timeouts))
return Status(kInvalidArgument, "'timeouts' must be a JSON object");
std::map<std::string, Parser> parser_map;
parser_map["script"] =
base::BindRepeating(&ParseTimeDelta, &capabilities->script_timeout);
parser_map["pageLoad"] =
base::BindRepeating(&ParseTimeDelta, &capabilities->page_load_timeout);
parser_map["implicit"] = base::BindRepeating(
&ParseTimeDelta, &capabilities->implicit_wait_timeout);
for (const auto& it : timeouts->DictItems()) {
if (parser_map.find(it.first) == parser_map.end())
return Status(kInvalidArgument,
"unrecognized 'timeouts' option: " + it.first);
Status status = parser_map[it.first].Run(it.second, capabilities);
if (status.IsError())
return Status(kInvalidArgument, "cannot parse " + it.first, status);
}
return Status(kOk);
}
Status ParseSwitches(const base::Value& option, Status ParseSwitches(const base::Value& option,
Capabilities* capabilities) { Capabilities* capabilities) {
const base::ListValue* switches_list = NULL; const base::ListValue* switches_list = NULL;
...@@ -705,7 +729,7 @@ Status Capabilities::Parse(const base::DictionaryValue& desired_caps) { ...@@ -705,7 +729,7 @@ Status Capabilities::Parse(const base::DictionaryValue& desired_caps) {
base::BindRepeating(&ParseString, &platform_name); base::BindRepeating(&ParseString, &platform_name);
parser_map["pageLoadStrategy"] = base::BindRepeating(&ParsePageLoadStrategy); parser_map["pageLoadStrategy"] = base::BindRepeating(&ParsePageLoadStrategy);
parser_map["proxy"] = base::BindRepeating(&ParseProxy); parser_map["proxy"] = base::BindRepeating(&ParseProxy);
// TODO(https://crbug.com/chromedriver/1997): Parse "timeouts". parser_map["timeouts"] = base::BindRepeating(&ParseTimeouts);
// TODO(https://crbug.com/chromedriver/2596): "unexpectedAlertBehaviour" is // TODO(https://crbug.com/chromedriver/2596): "unexpectedAlertBehaviour" is
// legacy name of "unhandledPromptBehavior", remove when we stop supporting // legacy name of "unhandledPromptBehavior", remove when we stop supporting
// legacy mode. // legacy mode.
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include "chrome/test/chromedriver/chrome/devtools_http_client.h" #include "chrome/test/chromedriver/chrome/devtools_http_client.h"
#include "chrome/test/chromedriver/chrome/log.h" #include "chrome/test/chromedriver/chrome/log.h"
#include "chrome/test/chromedriver/net/net_util.h" #include "chrome/test/chromedriver/net/net_util.h"
#include "chrome/test/chromedriver/session.h"
namespace base { namespace base {
class CommandLine; class CommandLine;
...@@ -119,10 +120,9 @@ struct Capabilities { ...@@ -119,10 +120,9 @@ struct Capabilities {
// Data from "proxy" capability are stored in "switches" field. // Data from "proxy" capability are stored in "switches" field.
// The default values for the timeout fields came from W3C spec. base::TimeDelta script_timeout = Session::kDefaultScriptTimeout;
base::TimeDelta script_timeout = base::TimeDelta::FromSeconds(30); base::TimeDelta page_load_timeout = Session::kDefaultPageLoadTimeout;
base::TimeDelta page_load_timeout = base::TimeDelta::FromSeconds(300); base::TimeDelta implicit_wait_timeout = Session::kDefaultImplicitWaitTimeout;
base::TimeDelta implicit_wait_timeout = base::TimeDelta::FromSeconds(0);
std::string unhandled_prompt_behavior; std::string unhandled_prompt_behavior;
......
...@@ -132,7 +132,7 @@ class ChromeDriver(object): ...@@ -132,7 +132,7 @@ class ChromeDriver(object):
send_w3c_capability=None, send_w3c_request=None, send_w3c_capability=None, send_w3c_request=None,
page_load_strategy=None, unexpected_alert_behaviour=None, page_load_strategy=None, unexpected_alert_behaviour=None,
devtools_events_to_log=None, accept_insecure_certs=None, devtools_events_to_log=None, accept_insecure_certs=None,
test_name=None): timeouts=None, test_name=None):
self._executor = command_executor.CommandExecutor(server_url) self._executor = command_executor.CommandExecutor(server_url)
self.w3c_compliant = False self.w3c_compliant = False
...@@ -230,6 +230,9 @@ class ChromeDriver(object): ...@@ -230,6 +230,9 @@ class ChromeDriver(object):
if accept_insecure_certs is not None: if accept_insecure_certs is not None:
params['acceptInsecureCerts'] = accept_insecure_certs params['acceptInsecureCerts'] = accept_insecure_certs
if timeouts is not None:
params['timeouts'] = timeouts
if test_name is not None: if test_name is not None:
params['goog:testName'] = test_name params['goog:testName'] = test_name
...@@ -360,6 +363,9 @@ class ChromeDriver(object): ...@@ -360,6 +363,9 @@ class ChromeDriver(object):
return self.ExecuteCommand( return self.ExecuteCommand(
Command.FIND_ELEMENTS, {'using': strategy, 'value': target}) Command.FIND_ELEMENTS, {'using': strategy, 'value': target})
def GetTimeouts(self):
return self.ExecuteCommand(Command.GET_TIMEOUTS)
def SetTimeouts(self, params): def SetTimeouts(self, params):
return self.ExecuteCommand(Command.SET_TIMEOUTS, params) return self.ExecuteCommand(Command.SET_TIMEOUTS, params)
......
...@@ -29,10 +29,13 @@ FrameInfo::FrameInfo(const std::string& parent_frame_id, ...@@ -29,10 +29,13 @@ FrameInfo::FrameInfo(const std::string& parent_frame_id,
frame_id(frame_id), frame_id(frame_id),
chromedriver_frame_id(chromedriver_frame_id) {} chromedriver_frame_id(chromedriver_frame_id) {}
// The default timeout values came from W3C spec.
const base::TimeDelta Session::kDefaultImplicitWaitTimeout =
base::TimeDelta::FromSeconds(0);
const base::TimeDelta Session::kDefaultPageLoadTimeout = const base::TimeDelta Session::kDefaultPageLoadTimeout =
base::TimeDelta::FromMinutes(5); base::TimeDelta::FromSeconds(300);
const base::TimeDelta Session::kDefaultScriptTimeout = const base::TimeDelta Session::kDefaultScriptTimeout =
base::TimeDelta::FromMilliseconds(30000); base::TimeDelta::FromSeconds(30);
Session::Session(const std::string& id) Session::Session(const std::string& id)
: id(id), : id(id),
...@@ -43,6 +46,7 @@ Session::Session(const std::string& id) ...@@ -43,6 +46,7 @@ Session::Session(const std::string& id)
sticky_modifiers(0), sticky_modifiers(0),
mouse_position(0, 0), mouse_position(0, 0),
pressed_mouse_button(kNoneMouseButton), pressed_mouse_button(kNoneMouseButton),
implicit_wait(kDefaultImplicitWaitTimeout),
page_load_timeout(kDefaultPageLoadTimeout), page_load_timeout(kDefaultPageLoadTimeout),
script_timeout(kDefaultScriptTimeout), script_timeout(kDefaultScriptTimeout),
auto_reporting_enabled(false) {} auto_reporting_enabled(false) {}
...@@ -57,6 +61,7 @@ Session::Session(const std::string& id, std::unique_ptr<Chrome> chrome) ...@@ -57,6 +61,7 @@ Session::Session(const std::string& id, std::unique_ptr<Chrome> chrome)
sticky_modifiers(0), sticky_modifiers(0),
mouse_position(0, 0), mouse_position(0, 0),
pressed_mouse_button(kNoneMouseButton), pressed_mouse_button(kNoneMouseButton),
implicit_wait(kDefaultImplicitWaitTimeout),
page_load_timeout(kDefaultPageLoadTimeout), page_load_timeout(kDefaultPageLoadTimeout),
script_timeout(kDefaultScriptTimeout), script_timeout(kDefaultScriptTimeout),
auto_reporting_enabled(false) {} auto_reporting_enabled(false) {}
......
...@@ -50,6 +50,7 @@ struct FrameInfo { ...@@ -50,6 +50,7 @@ struct FrameInfo {
}; };
struct Session { struct Session {
static const base::TimeDelta kDefaultImplicitWaitTimeout;
static const base::TimeDelta kDefaultPageLoadTimeout; static const base::TimeDelta kDefaultPageLoadTimeout;
static const base::TimeDelta kDefaultScriptTimeout; static const base::TimeDelta kDefaultScriptTimeout;
......
...@@ -269,6 +269,10 @@ Status InitSessionHelper(const InitSessionParams& bound_params, ...@@ -269,6 +269,10 @@ Status InitSessionHelper(const InitSessionParams& bound_params,
session->unhandled_prompt_behavior = capabilities.unhandled_prompt_behavior; session->unhandled_prompt_behavior = capabilities.unhandled_prompt_behavior;
session->implicit_wait = capabilities.implicit_wait_timeout;
session->page_load_timeout = capabilities.page_load_timeout;
session->script_timeout = capabilities.script_timeout;
Log::Level driver_level = Log::kWarning; Log::Level driver_level = Log::kWarning;
if (capabilities.logging_prefs.count(WebDriverLog::kDriverType)) if (capabilities.logging_prefs.count(WebDriverLog::kDriverType))
driver_level = capabilities.logging_prefs[WebDriverLog::kDriverType]; driver_level = capabilities.logging_prefs[WebDriverLog::kDriverType];
......
...@@ -2159,6 +2159,25 @@ class ChromeSwitchesCapabilityTest(ChromeDriverBaseTest): ...@@ -2159,6 +2159,25 @@ class ChromeSwitchesCapabilityTest(ChromeDriverBaseTest):
class ChromeDesiredCapabilityTest(ChromeDriverBaseTest): class ChromeDesiredCapabilityTest(ChromeDriverBaseTest):
"""Tests that chromedriver properly processes desired capabilities.""" """Tests that chromedriver properly processes desired capabilities."""
def testDefaultTimeouts(self):
driver = self.CreateDriver()
timeouts = driver.GetTimeouts()
# Compare against defaults in W3C spec
self.assertEquals(timeouts['implicit'], 0)
self.assertEquals(timeouts['pageLoad'], 300000)
self.assertEquals(timeouts['script'], 30000)
def testTimeouts(self):
driver = self.CreateDriver(timeouts = {
'implicit': 123,
'pageLoad': 456,
'script': 789
})
timeouts = driver.GetTimeouts()
self.assertEquals(timeouts['implicit'], 123)
self.assertEquals(timeouts['pageLoad'], 456)
self.assertEquals(timeouts['script'], 789)
def testUnexpectedAlertBehaviour(self): def testUnexpectedAlertBehaviour(self):
driver = self.CreateDriver(unexpected_alert_behaviour="accept") driver = self.CreateDriver(unexpected_alert_behaviour="accept")
self.assertEquals("accept", self.assertEquals("accept",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment