3131 import json
3232from .desktop_browser import DesktopBrowser
3333
34+ def _get_location_uri (accuracy , lat , lng ) -> str :
35+ return f'data:application/json, {{ "status":"OK", "accuracy":{ accuracy } , "location":{{ "lat":{ lat } , "lng":{ lng } }} }}'
3436
3537class Firefox (DesktopBrowser ):
3638 """Firefox"""
@@ -140,26 +142,47 @@ def start_firefox(self, job, task):
140142 return
141143 from selenium import webdriver # pylint: disable=import-error
142144
143- capabilities = webdriver .DesiredCapabilities .FIREFOX .copy ()
144- if 'ignoreSSL' in job and job ['ignoreSSL' ]:
145- capabilities ['acceptInsecureCerts' ] = True
146- else :
147- capabilities ['acceptInsecureCerts' ] = False
145+ if webdriver .__version__ >= "4.12" :
146+ service_args = ["--marionette-port" , "2828" ]
147+ service = webdriver .FirefoxService (service_args = service_args , log_output = os .environ ["MOZ_LOG_FILE" ])
148148
149- capabilities ['moz:firefoxOptions' ] = {
150- 'binary' : self .path ,
151- 'args' : ['-profile' , task ['profile' ]],
152- 'prefs' : self .prepare_prefs (),
153- "log" : {"level" : "error" },
154- 'env' : {
155- "MOZ_LOG_FILE" : os .environ ["MOZ_LOG_FILE" ],
156- "MOZ_LOG" : os .environ ["MOZ_LOG" ]
157- }
158- }
159- service_args = ["--marionette-port" , "2828" ]
149+ options = webdriver .FirefoxOptions ()
150+ options .binary_location = self .path
151+ options .add_argument ('--profile' )
152+ options .add_argument (f'{ task ["profile" ]} ' )
153+ options .log .level = 'error'
154+ options .prefs = self .prepare_prefs ()
160155
161- self .driver = webdriver .Firefox (desired_capabilities = capabilities , service_args = service_args )
162- logging .debug (self .driver .capabilities )
156+ capabilities = webdriver .DesiredCapabilities .FIREFOX .copy ()
157+ if 'ignoreSSL' in job and job ['ignoreSSL' ]:
158+ capabilities ['acceptInsecureCerts' ] = True
159+ else :
160+ capabilities ['acceptInsecureCerts' ] = False
161+
162+ for key , value in capabilities .items ():
163+ options .set_capability (key , value )
164+ self .driver = webdriver .Firefox (options = options , service = service )
165+ elif webdriver .__version__ <= "4.9" :
166+ capabilities = webdriver .DesiredCapabilities .FIREFOX .copy ()
167+ if 'ignoreSSL' in job and job ['ignoreSSL' ]:
168+ capabilities ['acceptInsecureCerts' ] = True
169+ else :
170+ capabilities ['acceptInsecureCerts' ] = False
171+
172+ capabilities ['moz:firefoxOptions' ] = {
173+ 'binary' : self .path ,
174+ 'args' : ['-profile' , task ['profile' ]],
175+ 'prefs' : self .prepare_prefs (),
176+ "log" : {"level" : "error" },
177+ 'env' : {
178+ "MOZ_LOG_FILE" : os .environ ["MOZ_LOG_FILE" ],
179+ "MOZ_LOG" : os .environ ["MOZ_LOG" ]
180+ }
181+ }
182+ service_args = ["--marionette-port" , "2828" ]
183+ self .driver = webdriver .Firefox (desired_capabilities = capabilities , service_args = service_args )
184+ else :
185+ raise Exception ("Unsupported selenium version %s" , webdriver .__version__ )
163186
164187 self .driver .set_page_load_timeout (task ['time_limit' ])
165188 if 'browserVersion' in self .driver .capabilities :
@@ -208,17 +231,13 @@ def launch(self, job, task):
208231 ua_string += ' ' + task ['AppendUA' ]
209232 modified = True
210233 if modified :
211- logging .debug (ua_string )
212234 self .driver_set_pref ('general.useragent.override' , ua_string )
213235 # Location
214236 if 'lat' in self .job and 'lng' in self .job :
215237 try :
216238 lat = float (str (self .job ['lat' ]))
217239 lng = float (str (self .job ['lng' ]))
218- location_uri = 'data:application/json,{{' \
219- '"status":"OK","accuracy":10.0,' \
220- '"location":{{"lat":{0:f},"lng":{1:f}}}' \
221- '}}' .format (lat , lng )
240+ location_uri = _get_location_uri (10 , lat , lng )
222241 logging .debug ('Setting location: %s' , location_uri )
223242 self .driver_set_pref ('geo.wifi.uri' , location_uri )
224243 except Exception :
@@ -261,20 +280,12 @@ def driver_set_pref(self, key, value):
261280 """Set a Firefox pref at runtime"""
262281 if self .driver is not None :
263282 try :
264- script = 'const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");'
265- script += 'Services.prefs.'
266- if isinstance (value , bool ):
267- script += 'setBoolPref'
268- elif isinstance (value , (str , unicode )):
269- script += 'setStringPref'
270- else :
271- script += 'setIntPref'
272- script += '({0}, {1});' .format (json .dumps (key ), json .dumps (value ))
273- logging .debug (script )
283+ script = 'const { Preferences } = ChromeUtils.importESModule("resource://gre/modules/Preferences.sys.mjs");'
284+ script += f'Preferences.set({ json .dumps (key )} , { json .dumps (value )} );'
274285 self .driver .set_context (self .driver .CONTEXT_CHROME )
275286 self .driver .execute_script (script )
276- except Exception :
277- logging .exception ("Error setting pref" )
287+ except Exception as err :
288+ logging .exception ("Error setting pref %s => %s: %s" , key , value , err )
278289 finally :
279290 self .driver .set_context (self .driver .CONTEXT_CONTENT )
280291
@@ -300,6 +311,8 @@ def close_browser(self, job, task):
300311 if platform .system () == "Linux" :
301312 subprocess .call (['killall' , '-9' , 'firefox' ])
302313 subprocess .call (['killall' , '-9' , 'firefox-trunk' ])
314+ subprocess .call (['killall' , '-9' , 'firefox-nightly' ])
315+ subprocess .call (['killall' , '-9' , 'firefox-esr' ])
303316 os .environ ["MOZ_LOG_FILE" ] = ''
304317 os .environ ["MOZ_LOG" ] = ''
305318
@@ -334,7 +347,7 @@ def run_axe(self, task):
334347 script += "'" + "', '" .join (axe_cats ) + "'"
335348 script += ']}).then(results=>{return results;});'
336349 except Exception as err :
337- logging .exception ("Exception running Axe: %s" , err . __str__ () )
350+ logging .exception ("Exception running Axe: %s" , err )
338351 if self .must_exit_now :
339352 return
340353 completed = False
@@ -357,7 +370,7 @@ def run_axe(self, task):
357370 axe_info ['incomplete' ] = axe_results ['incomplete' ]
358371 task ['page_data' ]['axe' ] = axe_info
359372 except Exception as err :
360- logging .exception ("Exception running Axe: %s" , err . __str__ () )
373+ logging .exception ("Exception running Axe: %s" , err )
361374 if not completed :
362375 task ['page_data' ]['axe_failed' ] = 1
363376 self .axe_time = monotonic () - start
@@ -384,7 +397,7 @@ def run_task(self, task):
384397 logging .exception ("Exception running task" )
385398 if command ['record' ]:
386399 self .wait_for_page_load ()
387- if not task ['combine_steps' ] or not len ( task ['script' ]) :
400+ if not task ['combine_steps' ] or not task ['script' ]:
388401 self .on_stop_capture (task )
389402 self .on_stop_recording (task )
390403 recording = False
@@ -405,10 +418,9 @@ def run_task(self, task):
405418 self .task = None
406419
407420 def alert_size (self , _alert_config , _task_dir , _prefix ):
408- '''Checks the agents file size and alert on certain percentage over avg byte size'''
421+ '''Checks the agents file size and alert on certain percentage over avg byte size'''
409422 self .alert_desktop_results (_alert_config , 'Firefox' , _task_dir , _prefix )
410423
411-
412424 def wait_for_extension (self ):
413425 """Wait for the extension to send the started message"""
414426 if self .job ['message_server' ] is not None :
@@ -514,7 +526,7 @@ def run_js_file(self, file_name):
514526 script = None
515527 script_file_path = os .path .join (self .script_dir , file_name )
516528 if os .path .isfile (script_file_path ):
517- with open (script_file_path , 'r' ) as script_file :
529+ with open (script_file_path , 'r' , encoding = 'utf-8' ) as script_file :
518530 script = script_file .read ()
519531 if self .driver is not None and script is not None :
520532 try :
@@ -526,7 +538,7 @@ def run_js_file(self, file_name):
526538 logging .debug (ret )
527539 return ret
528540
529- def get_sorted_requests_json (self , include_bodies ):
541+ def get_sorted_requests_json (self , _include_bodies ):
530542 return 'null'
531543
532544 def collect_browser_metrics (self , task ):
@@ -970,10 +982,7 @@ def process_command(self, command):
970982 parts = command ['target' ].split (',' )
971983 lat = float (parts [0 ])
972984 lng = float (parts [1 ])
973- location_uri = 'data:application/json,{{' \
974- '"status":"OK","accuracy":{2:d},' \
975- '"location":{{"lat":{0:f},"lng":{1:f}}}' \
976- '}}' .format (lat , lng , accuracy )
985+ location_uri = _get_location_uri (accuracy , lat , lng )
977986 logging .debug ('Setting location: %s' , location_uri )
978987 self .set_pref ('geo.wifi.uri' , location_uri )
979988 except Exception :
0 commit comments