@@ -338,8 +338,11 @@ fn chrome_default_caps() -> Vec<&'static str> {
338338#[ cfg( feature = "geckodriver" ) ]
339339fn firefox_default_caps ( ) -> Vec < & ' static str > {
340340 vec ! [
341- "-headless" , // Essential for headless operation (single dash for Firefox)
342- "--no-remote" , // Prevents connecting to existing Firefox instances
341+ "-headless" , // Essential for headless operation (single dash for Firefox)
342+ "--no-remote" , // Prevents connecting to existing Firefox instances
343+ "--disable-gpu" , // Disable GPU hardware acceleration
344+ "--disable-software-rasterizer" , // Disable software rasterizer
345+ "--disable-dev-shm-usage" , // Disable /dev/shm usage (common in CI)
343346 ]
344347}
345348
@@ -1101,6 +1104,28 @@ impl StaticExporter {
11011104 debug ! ( "Added Firefox binary capability: {firefox_path}" ) ;
11021105 }
11031106
1107+ // Add Firefox-specific preferences for CI environments (when prefs are needed)
1108+ #[ cfg( feature = "geckodriver" ) ]
1109+ {
1110+ let mut prefs = JsonMap :: new ( ) ;
1111+ // Force software rendering and enable WebGL in headless mode
1112+ prefs. insert (
1113+ "layers.acceleration.disabled" . to_string ( ) ,
1114+ serde_json:: json!( true ) ,
1115+ ) ;
1116+ prefs. insert ( "gfx.webrender.all" . to_string ( ) , serde_json:: json!( false ) ) ;
1117+ prefs. insert (
1118+ "gfx.webrender.software" . to_string ( ) ,
1119+ serde_json:: json!( true ) ,
1120+ ) ;
1121+ prefs. insert ( "webgl.disabled" . to_string ( ) , serde_json:: json!( false ) ) ;
1122+ prefs. insert ( "webgl.force-enabled" . to_string ( ) , serde_json:: json!( true ) ) ;
1123+ prefs. insert ( "webgl.enable-webgl2" . to_string ( ) , serde_json:: json!( true ) ) ;
1124+
1125+ browser_opts. insert ( "prefs" . to_string ( ) , serde_json:: json!( prefs) ) ;
1126+ debug ! ( "Added Firefox preferences for CI compatibility" ) ;
1127+ }
1128+
11041129 caps. insert (
11051130 "browserName" . to_string ( ) ,
11061131 serde_json:: json!( get_browser_name( ) ) ,
0 commit comments