CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-org-seleniumhq-selenium--selenium-chromium-driver

Selenium Chrome Driver provides WebDriver implementation for Google Chrome with Chrome DevTools Protocol support, network conditions simulation, permissions management, media casting capabilities, and Chrome-specific service configuration.

Pending
Overview
Eval results
Files

permissions-management.mddocs/

Permissions Management

Browser permissions management allows control over web API access including camera, microphone, geolocation, notifications, and other browser permissions for comprehensive testing scenarios.

Permission Control

Set Permission

Grant or deny specific browser permissions.

public void setPermission(String name, String value);

Parameters:

  • name (String): Permission name to control
  • value (String): Permission state ("granted", "denied", "prompt")

Usage Example:

ChromiumDriver driver = new ChromiumDriver(commandExecutor, capabilities, "chrome");

// Grant camera permission
driver.setPermission("camera", "granted");

// Deny microphone permission  
driver.setPermission("microphone", "denied");

// Set geolocation to prompt user
driver.setPermission("geolocation", "prompt");

Common Permissions

Media Permissions

Control access to camera and microphone:

// Grant camera access
driver.setPermission("camera", "granted");

// Grant microphone access
driver.setPermission("microphone", "granted");

// Deny both camera and microphone
driver.setPermission("camera", "denied");
driver.setPermission("microphone", "denied");

// Test media permissions
driver.get("https://webrtc-test-site.com");
// Application can now access camera/microphone based on permissions set

Location Services

Control geolocation API access:

// Grant location access
driver.setPermission("geolocation", "granted");

// Test location-aware application
driver.get("https://maps-application.com");
// Application can access user location

// Deny location access
driver.setPermission("geolocation", "denied");
driver.get("https://maps-application.com");
// Application will be denied location access

Notification Permissions

Control web notification access:

// Grant notification permission
driver.setPermission("notifications", "granted");

// Test notification functionality
driver.get("https://notification-app.com");
WebElement enableNotificationsBtn = driver.findElement(By.id("enable-notifications"));
enableNotificationsBtn.click();
// Notifications will be allowed without user prompt

// Deny notifications
driver.setPermission("notifications", "denied");

Clipboard Permissions

Control clipboard API access:

// Grant clipboard read/write access
driver.setPermission("clipboard-read", "granted");
driver.setPermission("clipboard-write", "granted");

// Test clipboard functionality
driver.get("https://clipboard-app.com");
// Application can read from and write to system clipboard

// Deny clipboard access
driver.setPermission("clipboard-read", "denied");
driver.setPermission("clipboard-write", "denied");

Permission States

Available Permission Values

  • "granted": Permission is allowed without user prompt
  • "denied": Permission is explicitly denied
  • "prompt": Browser will prompt user for permission (default behavior)
// Explicit permission granting
driver.setPermission("camera", "granted");        // Always allow
driver.setPermission("microphone", "denied");     // Always deny  
driver.setPermission("geolocation", "prompt");    // Ask user

Comprehensive Permission Management

Set Multiple Permissions

public void configureMediaTestingPermissions(ChromiumDriver driver) {
    // Configure for media testing
    driver.setPermission("camera", "granted");
    driver.setPermission("microphone", "granted");
    driver.setPermission("notifications", "granted");
    driver.setPermission("geolocation", "granted");
    
    // Deny potentially disruptive permissions
    driver.setPermission("persistent-storage", "denied");
    driver.setPermission("background-sync", "denied");
}

public void configureRestrictivePermissions(ChromiumDriver driver) {
    // Deny all sensitive permissions
    driver.setPermission("camera", "denied");
    driver.setPermission("microphone", "denied");
    driver.setPermission("geolocation", "denied");
    driver.setPermission("notifications", "denied");
    driver.setPermission("clipboard-read", "denied");
    driver.setPermission("clipboard-write", "denied");
}

Test Permission Scenarios

import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;

public class PermissionTesting {
    
    public void testCameraPermissionGranted() {
        ChromiumDriver driver = new ChromiumDriver(commandExecutor, capabilities, "chrome");
        
        try {
            // Grant camera permission
            driver.setPermission("camera", "granted");
            
            // Navigate to video chat application
            driver.get("https://videochat-app.com");
            
            // Click button to access camera
            WebElement startVideoBtn = driver.findElement(By.id("start-video"));
            startVideoBtn.click();
            
            // Verify camera access works (no permission dialog)
            WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
            WebElement videoElement = wait.until(
                ExpectedConditions.presenceOfElementLocated(By.tagName("video"))
            );
            
            // Verify video stream is active
            assertTrue(videoElement.isDisplayed());
            
        } finally {
            driver.quit();
        }
    }
    
    public void testCameraPermissionDenied() {
        ChromiumDriver driver = new ChromiumDriver(commandExecutor, capabilities, "chrome");
        
        try {
            // Deny camera permission
            driver.setPermission("camera", "denied");
            
            // Navigate to video chat application
            driver.get("https://videochat-app.com");
            
            // Click button to access camera
            WebElement startVideoBtn = driver.findElement(By.id("start-video"));
            startVideoBtn.click();
            
            // Verify error message is shown
            WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
            WebElement errorMsg = wait.until(
                ExpectedConditions.presenceOfElementLocated(By.className("camera-error"))
            );
            
            assertTrue(errorMsg.getText().contains("Camera access denied"));
            
        } finally {
            driver.quit();
        }
    }
}

Permission Command Integration

The permissions functionality integrates with ChromiumDriverCommandExecutor:

// Command constant from AddHasPermissions
public static final String SET_PERMISSION = "setPermission";

Common Permission Names

Media Permissions

  • "camera" - Camera access
  • "microphone" - Microphone access

Location Services

  • "geolocation" - Location services access

User Interface

  • "notifications" - Web notifications
  • "fullscreen" - Fullscreen API access

Data Access

  • "clipboard-read" - Read from clipboard
  • "clipboard-write" - Write to clipboard
  • "persistent-storage" - Persistent storage quota

Background Operations

  • "background-sync" - Background synchronization
  • "push-messaging" - Push message reception

Sensors (if supported)

  • "accelerometer" - Device motion sensors
  • "gyroscope" - Device orientation sensors
  • "magnetometer" - Device compass sensors

Testing Permission Flows

Grant Permission Flow

public void testPermissionGrantFlow() {
    ChromiumDriver driver = new ChromiumDriver(commandExecutor, capabilities, "chrome");
    
    // Pre-grant permission to avoid user prompts
    driver.setPermission("geolocation", "granted");
    
    driver.get("https://location-app.com");
    
    // Click "Get My Location" button
    driver.findElement(By.id("get-location")).click();
    
    // Verify location is obtained without permission dialog
    WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
    WebElement locationDisplay = wait.until(
        ExpectedConditions.presenceOfElementLocated(By.id("current-location"))
    );
    
    assertFalse(locationDisplay.getText().isEmpty());
}

Deny Permission Flow

public void testPermissionDenyFlow() {
    ChromiumDriver driver = new ChromiumDriver(commandExecutor, capabilities, "chrome");
    
    // Pre-deny permission
    driver.setPermission("notifications", "denied");
    
    driver.get("https://news-app.com");
    
    // Click "Enable Notifications" button
    driver.findElement(By.id("enable-notifications")).click();
    
    // Verify appropriate error handling
    WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(3));
    WebElement errorMessage = wait.until(
        ExpectedConditions.presenceOfElementLocated(By.className("permission-denied"))
    );
    
    assertTrue(errorMessage.getText().contains("Notifications are blocked"));
}

Error Handling

Permission operations may encounter these exceptions:

  • IllegalArgumentException: When null permission name or value is provided
  • WebDriverException: When permission setting fails
try {
    driver.setPermission("camera", "granted");
} catch (IllegalArgumentException e) {
    System.err.println("Invalid permission parameters: " + e.getMessage());
} catch (WebDriverException e) {
    System.err.println("Failed to set permission: " + e.getMessage());
}

Best Practices

  1. Pre-configure Permissions: Set permissions before navigating to applications that need them
  2. Test Both Scenarios: Test both granted and denied permission scenarios
  3. Realistic Testing: Test with permissions that match your target users' likely configurations
  4. Error Handling: Verify applications handle permission denials gracefully
  5. Clean State: Consider resetting permissions between tests for consistent results
  6. Browser Compatibility: Different browsers may support different permission names
  7. User Experience: Test the complete permission flow from the user's perspective

Advanced Permission Testing

Dynamic Permission Changes

public void testDynamicPermissionChanges() {
    ChromiumDriver driver = new ChromiumDriver(commandExecutor, capabilities, "chrome");
    
    // Start with permission granted
    driver.setPermission("camera", "granted");
    driver.get("https://video-app.com");
    
    // Verify camera works
    driver.findElement(By.id("start-camera")).click();
    // ... verify camera functionality
    
    // Dynamically revoke permission
    driver.setPermission("camera", "denied");
    
    // Verify application handles permission revocation
    driver.findElement(By.id("start-camera")).click();
    // ... verify error handling
}

Permission Reset Utility

public class PermissionUtils {
    
    public static void resetAllPermissions(ChromiumDriver driver) {
        String[] permissions = {
            "camera", "microphone", "geolocation", "notifications",
            "clipboard-read", "clipboard-write", "persistent-storage"
        };
        
        for (String permission : permissions) {
            try {
                driver.setPermission(permission, "prompt");
            } catch (Exception e) {
                System.err.println("Failed to reset permission: " + permission);
            }
        }
    }
    
    public static void grantMediaPermissions(ChromiumDriver driver) {
        driver.setPermission("camera", "granted");
        driver.setPermission("microphone", "granted");
    }
    
    public static void denyAllPermissions(ChromiumDriver driver) {
        driver.setPermission("camera", "denied");
        driver.setPermission("microphone", "denied");
        driver.setPermission("geolocation", "denied");
        driver.setPermission("notifications", "denied");
    }
}

This comprehensive permissions management system enables thorough testing of web applications under various permission scenarios, ensuring robust handling of user privacy controls.

Install with Tessl CLI

npx tessl i tessl/maven-org-seleniumhq-selenium--selenium-chromium-driver

docs

application-launching.md

browser-configuration.md

devtools-protocol.md

index.md

media-casting.md

network-conditions.md

permissions-management.md

service-management.md

webdriver-operations.md

tile.json