summaryrefslogtreecommitdiffstats
path: root/chrome/test/pyautolib/chrome_driver_factory.py
blob: a5ef54bbf1f644b4a71a51b4acd99e073405d0fd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Factory that creates ChromeDriver instances for pyauto."""

import os
import random
import tempfile

import pyauto_paths
from selenium import webdriver
from selenium.webdriver.chrome import service


class ChromeDriverFactory(object):
  """"Factory that creates ChromeDriver instances for pyauto.

  Starts a single ChromeDriver server when necessary. Users should call 'Stop'
  when no longer using the factory.
  """

  def __init__(self, port=0):
    """Initialize ChromeDriverFactory.

    Args:
      port: The port for WebDriver to use; by default the service will select a
            free port.
    """
    self._chromedriver_port = port
    self._chromedriver_server = None

  def NewChromeDriver(self, pyauto):
    """Creates a new remote WebDriver instance.

    This instance will connect to a new automation provider of an already
    running Chrome.

    Args:
      pyauto: pyauto.PyUITest instance

    Returns:
      selenium.webdriver.remote.webdriver.WebDriver instance.
    """
    if pyauto.IsChromeOS():
      os.putenv('DISPLAY', ':0.0')
      os.putenv('XAUTHORITY', '/home/chronos/.Xauthority')
    self._StartServerIfNecessary()
    channel_id = 'testing' + hex(random.getrandbits(20 * 4))[2:-1]
    if not pyauto.IsWin():
      channel_id = os.path.join(tempfile.gettempdir(), channel_id)
    pyauto.CreateNewAutomationProvider(channel_id)
    return webdriver.Remote(self._chromedriver_server.service_url,
                            {'chrome.channel': channel_id,
                             'chrome.noWebsiteTestingDefaults': True})

  def _StartServerIfNecessary(self):
    """Starts the ChromeDriver server, if not already started."""
    if self._chromedriver_server is None:
      exe = pyauto_paths.GetChromeDriverExe()
      assert exe, 'Cannot find chromedriver exe. Did you build it?'
      self._chromedriver_server = service.Service(exe, self._chromedriver_port)
      self._chromedriver_server.start()

  def Stop(self):
    """Stops the ChromeDriver server, if running."""
    if self._chromedriver_server is not None:
      self._chromedriver_server.stop()
      self._chromedriver_server = None

  def GetPort(self):
    """Gets the port ChromeDriver is set to use.

    Returns:
      The port all ChromeDriver instances returned from NewChromeDriver() will
      be listening on. A return value of 0 indicates the ChromeDriver service
      will select a free port.
    """
    return self._chromedriver_port

  def __del__(self):
    self.Stop()