|
10 | 10 | import org.yaml.snakeyaml.Yaml; |
11 | 11 |
|
12 | 12 | import com.lambdatest.selenium.tunnel.TunnelManager; |
| 13 | +import com.lambdatest.selenium.lambdatest.capabilities.CapabilityProcessor; |
| 14 | +import com.lambdatest.selenium.lambdatest.capabilities.Selenium3Capabilities; |
| 15 | +import com.lambdatest.selenium.lambdatest.capabilities.Selenium4Capabilities; |
| 16 | +import com.lambdatest.selenium.lambdatest.capabilities.BrowserOptionsCapabilities; |
13 | 17 |
|
14 | 18 | /** |
15 | 19 | * YAML configuration reader for LambdaTest Selenium SDK. |
@@ -144,6 +148,7 @@ private void loadConfig() { |
144 | 148 | // Try multiple locations for lambdatest.yml |
145 | 149 | String[] locations = { |
146 | 150 | "lambdatest.yml", // Root directory |
| 151 | + "lambdatest.yaml" |
147 | 152 | }; |
148 | 153 |
|
149 | 154 | for (String location : locations) { |
@@ -290,54 +295,147 @@ public DesiredCapabilities getCapabilities(DesiredCapabilities codeCapabilities) |
290 | 295 |
|
291 | 296 | /** |
292 | 297 | * Get capabilities from YAML configuration. |
| 298 | + * Supports all Selenium 3, Selenium 4, and LambdaTest advanced capabilities. |
| 299 | + * |
| 300 | + * Supported Browsers (Selenium 3 & 4): |
| 301 | + * - Chrome |
| 302 | + * - Firefox |
| 303 | + * - Safari |
| 304 | + * - MS Edge (Microsoft Edge) |
| 305 | + * - Opera |
| 306 | + * - IE (Internet Explorer) |
| 307 | + * |
| 308 | + * Browser-specific options are supported for both Selenium 3 and 4: |
| 309 | + * - Chrome: chromeOptions / goog:chromeOptions |
| 310 | + * - Firefox: firefoxOptions / moz:firefoxOptions |
| 311 | + * - Edge: edgeOptions / ms:edgeOptions |
| 312 | + * - Safari: safariOptions / safari:options |
| 313 | + * - Opera: operaOptions |
| 314 | + * - IE: ieOptions / se:ieOptions |
| 315 | + * |
| 316 | + * Selenium 3 capabilities are set directly on DesiredCapabilities for backwards compatibility. |
| 317 | + * Selenium 4 capabilities use the W3C standard format with lt:options. |
293 | 318 | */ |
294 | 319 | public DesiredCapabilities getCapabilitiesFromYaml() { |
295 | 320 | DesiredCapabilities capabilities = new DesiredCapabilities(); |
296 | | - |
297 | | - // LambdaTest options from YAML |
298 | 321 | Map<String, Object> ltOptions = new HashMap<>(); |
| 322 | + CapabilityProcessor processor = new CapabilityProcessor(config, capabilities, ltOptions); |
| 323 | + |
| 324 | + // ============================================================ |
| 325 | + // 1. W3C Standard Browser Capabilities (Selenium 3 & 4) |
| 326 | + // ============================================================ |
| 327 | + processW3CBrowserCapabilities(capabilities); |
| 328 | + |
| 329 | + // ============================================================ |
| 330 | + // 2. Browser-Specific Options (Chrome, Firefox, Edge, etc.) |
| 331 | + // ============================================================ |
| 332 | + BrowserOptionsCapabilities.processBrowserOptions(config, capabilities); |
| 333 | + |
| 334 | + // ============================================================ |
| 335 | + // 3. LambdaTest Credentials (Required) |
| 336 | + // ============================================================ |
| 337 | + processCredentials(ltOptions); |
| 338 | + |
| 339 | + // ============================================================ |
| 340 | + // 4. Selenium 3 Capabilities (for backwards compatibility) |
| 341 | + // ============================================================ |
| 342 | + processor.process(Selenium3Capabilities.getDefinitions()); |
| 343 | + |
| 344 | + // Handle special case: version -> browserVersion mapping |
| 345 | + processVersionCapability(capabilities); |
| 346 | + |
| 347 | + // ============================================================ |
| 348 | + // 5. Selenium 4 / W3C Capabilities (LambdaTest advanced) |
| 349 | + // ============================================================ |
| 350 | + processor.process(Selenium4Capabilities.getDefinitions()); |
| 351 | + |
| 352 | + // ============================================================ |
| 353 | + // 6. Special Cases (require custom handling) |
| 354 | + // ============================================================ |
| 355 | + processSpecialCases(capabilities, ltOptions); |
| 356 | + |
| 357 | + // ============================================================ |
| 358 | + // 7. Finalize: Set lt:options on capabilities |
| 359 | + // ============================================================ |
| 360 | + capabilities.setCapability("lt:options", ltOptions); |
299 | 361 |
|
300 | | - // Basic browser config |
| 362 | + return capabilities; |
| 363 | + } |
| 364 | + |
| 365 | + /** |
| 366 | + * Process W3C standard browser capabilities (browserName, browserVersion, platformName). |
| 367 | + */ |
| 368 | + private void processW3CBrowserCapabilities(DesiredCapabilities capabilities) { |
| 369 | + // browserName (case-sensitive, mandatory) |
301 | 370 | if (config.containsKey("browserName")) { |
302 | 371 | capabilities.setCapability("browserName", config.get("browserName")); |
| 372 | + } else if (config.containsKey("browser")) { |
| 373 | + capabilities.setCapability("browserName", config.get("browser")); |
303 | 374 | } |
| 375 | + |
| 376 | + // browserVersion |
304 | 377 | if (config.containsKey("browserVersion")) { |
305 | 378 | capabilities.setCapability("browserVersion", config.get("browserVersion")); |
| 379 | + } else if (config.containsKey("version")) { |
| 380 | + capabilities.setCapability("browserVersion", config.get("version")); |
306 | 381 | } |
| 382 | + |
| 383 | + // platformName |
307 | 384 | if (config.containsKey("platformName")) { |
308 | 385 | capabilities.setCapability("platformName", config.get("platformName")); |
| 386 | + } else if (config.containsKey("platform")) { |
| 387 | + capabilities.setCapability("platformName", config.get("platform")); |
| 388 | + } else if (config.containsKey("OS")) { |
| 389 | + capabilities.setCapability("platformName", config.get("OS")); |
309 | 390 | } |
310 | | - |
311 | | - // LambdaTest credentials (required) - put only in lt:options for W3C compliance |
| 391 | + } |
| 392 | + |
| 393 | + /** |
| 394 | + * Process LambdaTest credentials. |
| 395 | + */ |
| 396 | + private void processCredentials(Map<String, Object> ltOptions) { |
312 | 397 | try { |
313 | 398 | String username = getUsername(); |
314 | 399 | String accessKey = getAccessKey(); |
315 | 400 | ltOptions.put("user", username); |
316 | 401 | ltOptions.put("accessKey", accessKey); |
317 | 402 | } catch (Exception e) { |
| 403 | + // Credentials will be required when creating WebDriver |
| 404 | + throw new RuntimeException("LambdaTest credentials not found. Please set LT_USERNAME and LT_ACCESS_KEY environment variables or add 'username' and 'accesskey' to lambdatest.yml"); |
318 | 405 | } |
319 | | - |
320 | | - // LambdaTest specific options |
321 | | - if (config.containsKey("build")) ltOptions.put("build", config.get("build")); |
322 | | - if (config.containsKey("project")) ltOptions.put("project", config.get("project")); |
323 | | - if (config.containsKey("name")) ltOptions.put("name", config.get("name")); |
324 | | - if (config.containsKey("video")) ltOptions.put("video", config.get("video")); |
325 | | - if (config.containsKey("network")) ltOptions.put("network", config.get("network")); |
326 | | - if (config.containsKey("console")) ltOptions.put("console", config.get("console")); |
327 | | - if (config.containsKey("visual")) ltOptions.put("visual", config.get("visual")); |
328 | | - if (config.containsKey("resolution")) ltOptions.put("resolution", config.get("resolution")); |
329 | | - if (config.containsKey("tunnel")) { |
330 | | - Object tunnelValue = config.get("tunnel"); |
331 | | - ltOptions.put("tunnel", tunnelValue); |
332 | | - |
333 | | - // Note: Tunnel will be started when WebDriver is actually created |
334 | | - // This prevents starting it too early before tests run |
| 406 | + } |
| 407 | + |
| 408 | + /** |
| 409 | + * Handle version capability special case (Selenium 3 compatibility). |
| 410 | + * version should be set on DesiredCapabilities AND as browserVersion for W3C. |
| 411 | + */ |
| 412 | + private void processVersionCapability(DesiredCapabilities capabilities) { |
| 413 | + if (config.containsKey("version") && !config.containsKey("browserVersion")) { |
| 414 | + Object versionValue = config.get("version"); |
| 415 | + capabilities.setCapability("version", versionValue); // Selenium 3 |
| 416 | + capabilities.setCapability("browserVersion", versionValue); // W3C |
| 417 | + } |
| 418 | + } |
| 419 | + |
| 420 | + /** |
| 421 | + * Process special cases that require custom logic. |
| 422 | + */ |
| 423 | + private void processSpecialCases(DesiredCapabilities capabilities, Map<String, Object> ltOptions) { |
| 424 | + // lambda:userFiles - set directly on capabilities (not in lt:options) |
| 425 | + if (config.containsKey("lambda:userFiles")) { |
| 426 | + capabilities.setCapability("lambda:userFiles", config.get("lambda:userFiles")); |
| 427 | + } else if (config.containsKey("userFiles")) { |
| 428 | + capabilities.setCapability("lambda:userFiles", config.get("userFiles")); |
335 | 429 | } |
336 | 430 |
|
337 | | - capabilities.setCapability("lt:options", ltOptions); |
338 | | - |
339 | | - |
340 | | - return capabilities; |
| 431 | + // project -> projectName mapping for Selenium 3, and project -> lt:options for Selenium 4 |
| 432 | + if (config.containsKey("project")) { |
| 433 | + Object projectValue = config.get("project"); |
| 434 | + ltOptions.put("project", projectValue); // Selenium 4 |
| 435 | + if (!config.containsKey("projectName")) { |
| 436 | + capabilities.setCapability("projectName", projectValue); // Selenium 3 |
| 437 | + } |
| 438 | + } |
341 | 439 | } |
342 | 440 |
|
343 | 441 | /** |
|
0 commit comments