Adds parameters to chromedriver wrapper.

Adds url base parameter so that the wrapper can start an instance of
chromedriver serving a nondefault url base (e.g. /wd/hub).

Adds parameter for extra arguments to be forwarded to the chromedriver
binary.

BUG=chromium:501600
TEST=run locally

Change-Id: I18b2669fc88d6692608f6ff17b70a0df61730e7b
Reviewed-on: https://chromium-review.googlesource.com/278214
Reviewed-by: Dan Shi <dshi@chromium.org>
Reviewed-by: David Abrahams <resetswitch@chromium.org>
Reviewed-by: Payton Turnage <turnage@chromium.org>
Commit-Queue: Payton Turnage <turnage@chromium.org>
Tested-by: Payton Turnage <turnage@chromium.org>
diff --git a/client/common_lib/cros/chromedriver.py b/client/common_lib/cros/chromedriver.py
index 0ed832d..a43453c 100644
--- a/client/common_lib/cros/chromedriver.py
+++ b/client/common_lib/cros/chromedriver.py
@@ -6,6 +6,7 @@
 import logging
 import os
 import urllib2
+import urlparse
 
 try:
     from selenium import webdriver
@@ -28,8 +29,8 @@
 
     def __init__(self, extra_chrome_flags=[], subtract_extra_chrome_flags=[],
                  extension_paths=[], is_component=True, username=None,
-                 password=None, server_port=None, skip_cleanup=False, *args,
-                 **kwargs):
+                 password=None, server_port=None, skip_cleanup=False,
+                 url_base=None, extra_chromedriver_args=None, *args, **kwargs):
         """Initialize.
 
         @param extra_chrome_flags: Extra chrome flags to pass to chrome, if any.
@@ -45,6 +46,9 @@
         @param skip_cleanup: If True, leave the server and browser running
                              so that remote tests can run after this script
                              ends. Default is False.
+        @param url_base: Optional base url for chromedriver.
+        @param extra_chromedriver_args: List of extra arguments to forward to
+                                        the chromedriver binary, if any.
         """
         self._cleanup = not skip_cleanup
         assert os.geteuid() == 0, 'Need superuser privileges'
@@ -63,7 +67,9 @@
         # Start ChromeDriver server
         self._server = chromedriver_server(CHROMEDRIVER_EXE_PATH,
                                            port=server_port,
-                                           skip_cleanup=skip_cleanup)
+                                           skip_cleanup=skip_cleanup,
+                                           url_base=url_base,
+                                           extra_args=extra_chromedriver_args)
 
         # Open a new tab using Chrome remote debugging. ChromeDriver expects
         # a tab opened for remote to work. Tabs opened using Telemetry will be
@@ -123,7 +129,8 @@
     src/chrome/test/chromedriver/server/server.py
     """
 
-    def __init__(self, exe_path, port=None, skip_cleanup=False):
+    def __init__(self, exe_path, port=None, skip_cleanup=False,
+                 url_base=None, extra_args=None):
         """Starts the ChromeDriver server and waits for it to be ready.
 
         Args:
@@ -132,6 +139,9 @@
             skip_cleanup: If True, leave the server running so that remote
                           tests can run after this script ends. Default is
                           False.
+            url_base: Optional base url for chromedriver.
+            extra_args: List of extra arguments to forward to the chromedriver
+                        binary, if any.
         Raises:
             RuntimeError if ChromeDriver fails to start
         """
@@ -146,6 +156,14 @@
             port = utils.get_unused_port()
         chromedriver_args.append('--port=%d' % port)
 
+        self.url = 'http://localhost:%d' % port
+        if url_base:
+            chromedriver_args.append('--url-base=%s' % url_base)
+            self.url = urlparse.urljoin(self.url, url_base)
+
+        if extra_args:
+            chromedriver_args.extend(extra_args)
+
         # TODO(ihf): Remove references to X after M45.
         # Chromedriver will look for an X server running on the display
         # specified through the DISPLAY environment variable.
@@ -153,7 +171,6 @@
         os.environ['XAUTHORITY'] = X_AUTHORITY
 
         self.bg_job = utils.BgJob(chromedriver_args, stderr_level=logging.DEBUG)
-        self.url = 'http://localhost:%d' % port
         if self.bg_job is None:
             raise RuntimeError('ChromeDriver server cannot be started')