1 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
5 """Factory that creates ChromeDriver instances for pyauto."""
12 from selenium
import webdriver
13 from selenium
.webdriver
.chrome
import service
16 class ChromeDriverFactory(object):
17 """"Factory that creates ChromeDriver instances for pyauto.
19 Starts a single ChromeDriver server when necessary. Users should call 'Stop'
20 when no longer using the factory.
23 def __init__(self
, port
=0):
24 """Initialize ChromeDriverFactory.
27 port: The port for WebDriver to use; by default the service will select a
30 self
._chromedriver
_port
= port
31 self
._chromedriver
_server
= None
33 def NewChromeDriver(self
, pyauto
):
34 """Creates a new remote WebDriver instance.
36 This instance will connect to a new automation provider of an already
40 pyauto: pyauto.PyUITest instance
43 selenium.webdriver.remote.webdriver.WebDriver instance.
45 if pyauto
.IsChromeOS():
46 os
.putenv('DISPLAY', ':0.0')
47 os
.putenv('XAUTHORITY', '/home/chronos/.Xauthority')
48 self
._StartServerIfNecessary
()
49 channel_id
= 'testing' + hex(random
.getrandbits(20 * 4))[2:-1]
50 if not pyauto
.IsWin():
51 channel_id
= os
.path
.join(tempfile
.gettempdir(), channel_id
)
52 pyauto
.CreateNewAutomationProvider(channel_id
)
53 return webdriver
.Remote(self
._chromedriver
_server
.service_url
,
54 {'chrome.channel': channel_id
,
55 'chrome.noWebsiteTestingDefaults': True})
57 def _StartServerIfNecessary(self
):
58 """Starts the ChromeDriver server, if not already started."""
59 if self
._chromedriver
_server
is None:
60 exe
= pyauto_paths
.GetChromeDriverExe()
61 assert exe
, 'Cannot find chromedriver exe. Did you build it?'
62 self
._chromedriver
_server
= service
.Service(exe
, self
._chromedriver
_port
)
63 self
._chromedriver
_server
.start()
66 """Stops the ChromeDriver server, if running."""
67 if self
._chromedriver
_server
is not None:
68 self
._chromedriver
_server
.stop()
69 self
._chromedriver
_server
= None
72 """Gets the port ChromeDriver is set to use.
75 The port all ChromeDriver instances returned from NewChromeDriver() will
76 be listening on. A return value of 0 indicates the ChromeDriver service
77 will select a free port.
79 return self
._chromedriver
_port