1+ using  System ; 
2+ using  OpenQA . Selenium ; 
3+ using  OpenQA . Selenium . Appium ; 
4+ using  OpenQA . Selenium . Appium . Android ; 
5+ using  OpenQA . Selenium . Appium . iOS ; 
6+ 
7+ namespace  DittoMauiTasksApp . UITests 
8+ { 
9+     // BrowserStack-specific test fixture for managing Appium driver lifecycle 
10+     public  class  BrowserStackTestFixture  :  IDisposable 
11+     { 
12+         public  AppiumDriver ?  Driver  {  get ;  private  set ;  } 
13+         
14+         public  BrowserStackTestFixture ( ) 
15+         { 
16+             InitializeBrowserStackDriver ( ) ; 
17+         } 
18+         
19+         private  void  InitializeBrowserStackDriver ( ) 
20+         { 
21+             var  username  =  Environment . GetEnvironmentVariable ( "BROWSERSTACK_USERNAME" ) ; 
22+             var  accessKey  =  Environment . GetEnvironmentVariable ( "BROWSERSTACK_ACCESS_KEY" ) ; 
23+             var  appId  =  Environment . GetEnvironmentVariable ( "BROWSERSTACK_APP_ID" ) ; 
24+             var  platform  =  Environment . GetEnvironmentVariable ( "BROWSERSTACK_PLATFORM" )  ??  "iOS" ; 
25+             var  device  =  Environment . GetEnvironmentVariable ( "BROWSERSTACK_DEVICE" )  ??  "iPhone 15" ; 
26+             var  osVersion  =  Environment . GetEnvironmentVariable ( "BROWSERSTACK_OS_VERSION" )  ??  "17" ; 
27+             
28+             if  ( string . IsNullOrEmpty ( username )  ||  string . IsNullOrEmpty ( accessKey )  ||  string . IsNullOrEmpty ( appId ) ) 
29+             { 
30+                 Console . WriteLine ( "⚠️ BrowserStack credentials not found - using null driver" ) ; 
31+                 Driver  =  null ; 
32+                 return ; 
33+             } 
34+             
35+             try 
36+             { 
37+                 var  capabilities  =  new  AppiumOptions ( ) ; 
38+                 
39+                 // BrowserStack specific capabilities 
40+                 capabilities . AddAdditionalCapability ( "browserstack.user" ,  username ) ; 
41+                 capabilities . AddAdditionalCapability ( "browserstack.key" ,  accessKey ) ; 
42+                 capabilities . AddAdditionalCapability ( "app" ,  appId ) ; 
43+                 
44+                 // Project information 
45+                 capabilities . AddAdditionalCapability ( "project" ,  "Ditto MAUI Quickstart" ) ; 
46+                 capabilities . AddAdditionalCapability ( "build" ,  $ "Build #{ Environment . GetEnvironmentVariable ( "GITHUB_RUN_NUMBER" )  ??  "local" } ") ; 
47+                 capabilities . AddAdditionalCapability ( "name" ,  $ "Ditto { platform }  Sync Test") ; 
48+                 
49+                 // Debug capabilities 
50+                 capabilities . AddAdditionalCapability ( "browserstack.debug" ,  true ) ; 
51+                 capabilities . AddAdditionalCapability ( "browserstack.video" ,  true ) ; 
52+                 capabilities . AddAdditionalCapability ( "browserstack.networkLogs" ,  true ) ; 
53+                 capabilities . AddAdditionalCapability ( "browserstack.appiumLogs" ,  true ) ; 
54+                 
55+                 if  ( platform . Equals ( "iOS" ,  StringComparison . OrdinalIgnoreCase ) ) 
56+                 { 
57+                     // iOS capabilities 
58+                     capabilities . AddAdditionalCapability ( "platformName" ,  "iOS" ) ; 
59+                     capabilities . AddAdditionalCapability ( "platformVersion" ,  osVersion ) ; 
60+                     capabilities . AddAdditionalCapability ( "deviceName" ,  device ) ; 
61+                     capabilities . AddAdditionalCapability ( "automationName" ,  "XCUITest" ) ; 
62+                     capabilities . AddAdditionalCapability ( "browserstack.resignApp" ,  true ) ; 
63+                     capabilities . AddAdditionalCapability ( "autoGrantPermissions" ,  true ) ; 
64+                     
65+                     var  hubUrl  =  new  Uri ( "https://hub-cloud.browserstack.com/wd/hub" ) ; 
66+                     Driver  =  new  IOSDriver ( hubUrl ,  capabilities ,  TimeSpan . FromMinutes ( 10 ) ) ; 
67+                 } 
68+                 else  if  ( platform . Equals ( "Android" ,  StringComparison . OrdinalIgnoreCase ) ) 
69+                 { 
70+                     // Android capabilities 
71+                     capabilities . AddAdditionalCapability ( "platformName" ,  "Android" ) ; 
72+                     capabilities . AddAdditionalCapability ( "platformVersion" ,  osVersion ) ; 
73+                     capabilities . AddAdditionalCapability ( "deviceName" ,  device ) ; 
74+                     capabilities . AddAdditionalCapability ( "automationName" ,  "UiAutomator2" ) ; 
75+                     capabilities . AddAdditionalCapability ( "autoGrantPermissions" ,  true ) ; 
76+                     
77+                     var  hubUrl  =  new  Uri ( "https://hub-cloud.browserstack.com/wd/hub" ) ; 
78+                     Driver  =  new  AndroidDriver ( hubUrl ,  capabilities ,  TimeSpan . FromMinutes ( 10 ) ) ; 
79+                 } 
80+                 else 
81+                 { 
82+                     throw  new  ArgumentException ( $ "Unsupported platform: { platform } ") ; 
83+                 } 
84+                 
85+                 Console . WriteLine ( $ "✅ BrowserStack { platform }  driver initialized successfully") ; 
86+                 Console . WriteLine ( $ "Device: { device }  ({ osVersion } )") ; 
87+                 Console . WriteLine ( $ "App ID: { appId } ") ; 
88+             } 
89+             catch  ( Exception  ex ) 
90+             { 
91+                 Console . WriteLine ( $ "❌ Failed to initialize BrowserStack driver: { ex . Message } ") ; 
92+                 Driver  =  null ; 
93+             } 
94+         } 
95+         
96+         public  void  Dispose ( ) 
97+         { 
98+             try 
99+             { 
100+                 Driver ? . Quit ( ) ; 
101+                 Console . WriteLine ( "BrowserStack driver disposed" ) ; 
102+             } 
103+             catch  ( Exception  ex ) 
104+             { 
105+                 Console . WriteLine ( $ "Error disposing BrowserStack driver: { ex . Message } ") ; 
106+             } 
107+         } 
108+     } 
109+ } 
0 commit comments