20 from robot.api
import logger
21 from robot.utils
import ConnectionCache
22 from selenium
import webdriver
30 'googlechrome':
"chrome",
33 'headlesschrome':
'headless_chrome',
36 'headlessfirefox':
'headless_firefox',
38 'internetexplorer':
'ie',
42 'phantomjs':
'phantomjs',
43 'htmlunit':
'htmlunit',
44 'htmlunitwithjs':
'htmlunit_with_js',
53 profile_dir=None, service_log_path=None):
55 desired_capabilities = self.
_parse_capabilities_parse_capabilities(desired_capabilities, browser)
56 service_log_path = self.
_get_log_path_get_log_path(service_log_path)
58 logger.info(
'Browser driver log file created to: %s' % service_log_path)
62 return creation_method(desired_capabilities, remote_url,
63 profile_dir, service_log_path=service_log_path)
64 return creation_method(desired_capabilities, remote_url, service_log_path=service_log_path)
67 browser = browser.lower().replace(
' ',
'')
69 return getattr(self,
'create_{}'.format(self.
browser_namesbrowser_names[browser]))
70 raise ValueError(
'{} is not a supported browser.'.format(browser))
75 if not isinstance(capabilities, dict):
77 browser = self.
browser_namesbrowser_names.get(browser, browser)
78 if browser
in [
'ie',
'firefox',
'edge']:
79 return {
'capabilities': capabilities}
80 return {
'desired_capabilities': capabilities}
83 desired_capabilities = {}
84 for part
in capabilities.split(
','):
85 key, value = part.split(
':')
86 desired_capabilities[key.strip()] = value.strip()
87 return desired_capabilities
90 if not set_capabilities:
91 return {
'desired_capabilities': default_capabilities}
92 if 'capabilities' in set_capabilities:
93 caps = set_capabilities[
'capabilities']
95 caps = set_capabilities[
'desired_capabilities']
96 if 'browserName' not in caps:
97 caps[
'browserName'] = default_capabilities[
'browserName']
98 return {
'desired_capabilities': caps}
100 def create_chrome(self, desired_capabilities, remote_url, options=None, service_log_path=None):
102 defaul_caps = webdriver.DesiredCapabilities.CHROME.copy()
104 return self.
_remote_remote(desired_capabilities, remote_url, options=options)
105 return webdriver.Chrome(options=options, service_log_path=service_log_path, **desired_capabilities)
108 options = webdriver.ChromeOptions()
110 options.set_headless()
111 return self.
create_chromecreate_chrome(desired_capabilities, remote_url, options, service_log_path)
113 def create_firefox(self, desired_capabilities, remote_url, ff_profile_dir, options=None, service_log_path=None):
116 defaul_caps = webdriver.DesiredCapabilities.FIREFOX.copy()
118 return self.
_remote_remote(desired_capabilities, remote_url,
121 return webdriver.Firefox(options=options, firefox_profile=profile, service_log_path=service_log_path,
122 **desired_capabilities)
126 return webdriver.FirefoxProfile()
127 return webdriver.FirefoxProfile(ff_profile_dir)
130 _geckodriver_log = property
133 log_file = self.
_get_log_path_get_log_path(os.path.join(self.
log_dirlog_dir,
'geckodriver-{index}.log'))
134 logger.info(
'Firefox driver log is always forced to to: %s' % log_file)
138 ff_profile_dir, service_log_path=None):
139 options = webdriver.FirefoxOptions()
141 options.set_headless()
142 return self.
create_firefoxcreate_firefox(desired_capabilities, remote_url, ff_profile_dir, options, service_log_path)
144 def create_ie(self, desired_capabilities, remote_url, service_log_path=None):
146 defaul_caps = webdriver.DesiredCapabilities.INTERNETEXPLORER.copy()
148 return self.
_remote_remote(desired_capabilities, remote_url)
150 return webdriver.Ie(service_log_path=service_log_path, **desired_capabilities)
151 logger.warn(
'This version of Selenium does not support service_log_path argument.')
152 return webdriver.Ie(**desired_capabilities)
155 signature = inspect.getargspec(web_driver.__init__)
156 return True if 'service_log_path' in signature.args
else False
158 def create_edge(self, desired_capabilities, remote_url, service_log_path=None):
160 defaul_caps = webdriver.DesiredCapabilities.EDGE.copy()
162 return self.
_remote_remote(desired_capabilities, remote_url)
164 return webdriver.Edge(service_log_path=service_log_path, **desired_capabilities)
165 logger.warn(
'This version of Selenium does not support service_log_path argument.')
166 return webdriver.Edge(**desired_capabilities)
168 def create_opera(self, desired_capabilities, remote_url, service_log_path=None):
170 defaul_caps = webdriver.DesiredCapabilities.OPERA.copy()
172 return self.
_remote_remote(desired_capabilities, remote_url)
173 return webdriver.Opera(service_log_path=service_log_path, **desired_capabilities)
177 defaul_caps = webdriver.DesiredCapabilities.SAFARI.copy()
179 return self.
_remote_remote(desired_capabilities, remote_url)
180 return webdriver.Safari(**desired_capabilities)
183 warnings.warn(
'SeleniumLibrary support for PhantomJS has been deprecated, '
184 'please use headlesschrome or headlessfirefox instead.')
186 defaul_caps = webdriver.DesiredCapabilities.PHANTOMJS.copy()
188 return self.
_remote_remote(desired_capabilities, remote_url)
189 return webdriver.PhantomJS(service_log_path=service_log_path, **desired_capabilities)
193 logger.warn(
'Htmlunit does not support service_log_path argument.')
194 defaul_caps = webdriver.DesiredCapabilities.HTMLUNIT.copy()
196 return self.
_remote_remote(desired_capabilities, remote_url)
200 logger.warn(
'Htmlunit does not support service_log_path argument.')
201 defaul_caps = webdriver.DesiredCapabilities.HTMLUNITWITHJS.copy()
203 return self.
_remote_remote(desired_capabilities, remote_url)
205 def create_android(self, desired_capabilities, remote_url, service_log_path=None):
207 logger.warn(
'Android does not support service_log_path argument.')
208 defaul_caps = webdriver.DesiredCapabilities.ANDROID.copy()
210 return self.
_remote_remote(desired_capabilities, remote_url)
212 def create_iphone(self, desired_capabilities, remote_url, service_log_path=None):
214 logger.warn(
'iPhone does not support service_log_path argument.')
215 defaul_caps = webdriver.DesiredCapabilities.IPHONE.copy()
217 return self.
_remote_remote(desired_capabilities, remote_url)
219 def _remote(self, desired_capabilities, remote_url,
220 profile_dir=None, options=None):
221 remote_url = str(remote_url)
222 return webdriver.Remote(command_executor=remote_url,
223 browser_profile=profile_dir, options=options,
224 **desired_capabilities)
231 formatted = log_file.format(index=index)
232 path = os.path.join(self.
log_dirlog_dir, formatted)
234 if formatted == log_file
or not os.path.exists(path):
239 target_dir = os.path.dirname(path)
240 if not os.path.exists(target_dir):
241 os.makedirs(target_dir)
247 ConnectionCache.__init__(self, no_current_msg=
'No current browser')
254 return self._connections
257 active_drivers = property
261 for driver
in self._connections:
262 if driver
not in self.
_closed_closed:
263 open_drivers.append(driver)
269 error = self.
_quit_quit(driver,
None)
271 self.
_closed_closed.add(driver)
277 for driver
in self._connections:
278 if driver
not in self.
_closed_closed:
279 error = self.
_quit_quit(driver, error)
288 except Exception
as exception:
289 logger.error(
'When closing browser, received exception: %s' % exception)
294 index = self.
_get_index_get_index(alias_or_index)
296 driver = self.get_connection(index)
299 return None if driver
in self.
_closed_closed
else index
302 alias_or_index =
None if is_noney(alias_or_index)
else alias_or_index
304 return self.resolve_alias_or_index(alias_or_index)
305 except AttributeError:
312 return self._resolve_alias_or_index(alias_or_index)