Browser profile management in Selenium Java - Build an Automation Script
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxOptions; import org.openqa.selenium.firefox.FirefoxProfile; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import java.time.Duration; public class BrowserProfileTest { public static void main(String[] args) { // Set system property for geckodriver path if needed // System.setProperty("webdriver.gecko.driver", "/path/to/geckodriver"); // Create Firefox profile FirefoxProfile profile = new FirefoxProfile(); // Disable image loading: set preference to 2 (block images) profile.setPreference("permissions.default.image", 2); // Set Firefox options with profile FirefoxOptions options = new FirefoxOptions(); options.setProfile(profile); // Initialize WebDriver with options WebDriver driver = new FirefoxDriver(options); try { // Navigate to example.com driver.get("https://example.com"); // Wait for page to load WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); wait.until(ExpectedConditions.presenceOfElementLocated(By.tagName("body"))); // Verify images are not loaded // Check if any <img> elements have naturalWidth > 0 (means loaded) boolean imagesLoaded = (Boolean) ((org.openqa.selenium.JavascriptExecutor) driver).executeScript( "return Array.from(document.images).some(img => img.naturalWidth > 0);" ); if (!imagesLoaded) { System.out.println("Test Passed: Images are blocked as per profile settings."); } else { System.out.println("Test Failed: Images are loaded despite profile settings."); } } finally { // Close browser driver.quit(); } } }
This test script creates a Firefox profile and sets a preference to block images from loading. It then launches Firefox with this profile using Selenium WebDriver.
After navigating to a website with images, it uses JavaScript execution to check if any images have loaded by checking their naturalWidth property.
If no images are loaded, the test prints a pass message; otherwise, it prints a fail message.
The script uses explicit waits to ensure the page body is present before checking images.
Finally, the browser is closed properly in a finally block to avoid resource leaks.
Now add data-driven testing with 3 different Firefox profile preferences to block images, block JavaScript, and block CSS.
Practice
Solution
Step 1: Understand browser profile role
A browser profile lets you set preferences like cookies, extensions, or homepage before starting the browser.Step 2: Identify the main benefit
This customization makes tests more reliable and realistic by simulating real user settings.Final Answer:
To customize browser settings before launching for more realistic tests -> Option AQuick Check:
Browser profile = customize settings [OK]
- Thinking profiles speed up tests by skipping browser startup
- Confusing profiles with test report generation
- Believing profiles change test script language
Solution
Step 1: Recall Java object creation syntax
In Java, to create a new object, use the 'new' keyword followed by the constructor with parentheses.Step 2: Apply to FirefoxProfile
The correct syntax is 'new FirefoxProfile();' with parentheses and semicolon.Final Answer:
FirefoxProfile profile = new FirefoxProfile(); -> Option CQuick Check:
Java new object = new ClassName(); [OK]
- Omitting parentheses after constructor
- Missing 'new' keyword
- Using incorrect method-like syntax
FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("browser.startup.homepage", "https://example.com");
FirefoxOptions options = new FirefoxOptions();
options.setProfile(profile);
WebDriver driver = new FirefoxDriver(options);
driver.get("about:home");
String currentUrl = driver.getCurrentUrl();Solution
Step 1: Understand profile preference setting
The code sets the Firefox homepage preference to 'https://example.com' in the profile.Step 2: Analyze driver.get call
Despite the homepage setting, the code explicitly opens 'about:home' using driver.get(). So the browser opens that page.Step 3: Check current URL
Since driver.get("about:home") is called, currentUrl will be 'about:home', but the browser's homepage is set to 'https://example.com'.Final Answer:
The browser will open with homepage https://example.com but currentUrl will be 'about:home' -> Option BQuick Check:
driver.get overrides homepage for current URL [OK]
- Assuming homepage setting overrides driver.get call
- Confusing currentUrl with homepage URL
- Thinking profile setting causes runtime error
ChromeOptions options = new ChromeOptions();
options.setProfile("UserProfile");
WebDriver driver = new ChromeDriver(options);Solution
Step 1: Check ChromeOptions API
ChromeOptions class does not have a method named setProfile(). Profiles are set using addArguments or user-data-dir option.Step 2: Correct way to set profile
To use a Chrome profile, you add an argument like '--user-data-dir=path_to_profile' via options.addArguments().Final Answer:
ChromeOptions does not have a setProfile method; use addArguments instead -> Option DQuick Check:
ChromeOptions.setProfile() does not exist [OK]
- Calling non-existent setProfile method on ChromeOptions
- Passing profile name as string without path
- Assuming ChromeDriver can't accept options
Solution
Step 1: Understand parallel test isolation
Running tests in parallel requires isolated browser states to prevent data conflicts.Step 2: Use separate profiles per test
Creating a new FirefoxProfile per test with unique settings ensures each browser instance is independent.Step 3: Pass profile via FirefoxOptions
Each test passes its profile to FirefoxOptions, which launches Firefox with that profile.Final Answer:
Create a new FirefoxProfile instance for each test with unique preferences and pass it to FirefoxOptions -> Option AQuick Check:
Separate profiles per test = no conflicts [OK]
- Sharing one profile instance across tests causing conflicts
- Not using profiles and relying on manual cookie clearing
- Setting homepage globally does not isolate tests
Ready to prove it?
Pass the test and this pattern moves unknown
