Selenium
Integrate Selenium WebDriver with Kameleo to automate browsing using realistic, spoofed browser fingerprints.
You can start a profile in two ways:
- Explicit start: Create the profile via the Local API and call
startProfile. Use this when you need custom command-line switches, proxy settings, flags, or advanced options. - Auto-start: Skip
startProfile. When Selenium connects with thekameleo:profileIdcapability, Kameleo automatically starts the profile using defaults.
After either approach, you control the browser with normal Selenium commands, then clean up (stop / export / delete) the profile.
Prerequisites
- Completion of the Quickstart guide
- A Selenium-capable environment (Python, JavaScript, or C# with Selenium libraries installed)
Option 1: Explicitly start the profile (customizable)
Use this when you must set advanced startup parameters. Example below show a start with some custom settings.
1. Create a profile
from kameleo.local_api_client import KameleoLocalApiClient
from kameleo.local_api_client.models import CreateProfileRequest
client = KameleoLocalApiClient(endpoint='http://localhost:5050')
client.verify_engine_ready()
fingerprints = client.fingerprint.search_fingerprints(
device_type='desktop',
browser_product='chrome'
)
create_req = CreateProfileRequest(
fingerprint_id=fingerprints[0].id,
name='selenium explicit start example'
)
profile = client.profile.create_profile(create_req)
import { KameleoLocalApiClient } from "@kameleo/local-api-client";
const client = new KameleoLocalApiClient({ basePath: "http://localhost:5050" });
await client.verifyEngineReady();
const fingerprints = await client.fingerprint.searchFingerprints("desktop", undefined, "chrome");
const createProfileRequest = { fingerprintId: fingerprints[0].id, name: "selenium explicit start example" };
const profile = await client.profile.createProfile(createProfileRequest);
using Kameleo.LocalApiClient;
using Kameleo.LocalApiClient.Model;
var client = new KameleoLocalApiClient(new Uri("http://localhost:5050"));
await client.VerifyEngineReadyAsync();
var fingerprints = await client.Fingerprint.SearchFingerprintsAsync(deviceType: "desktop", browserProduct: "chrome");
var createProfileRequest = new CreateProfileRequest(fingerprints[0].Id) { Name = "selenium explicit start example" };
var profile = await client.Profile.CreateProfileAsync(createProfileRequest);
2. Start the profile (customization point)
Below are three common customization patterns. Pick one (or combine arguments + preferences) before connecting Selenium. The browser must be stopped and restarted to apply a different set.
- Add command-line arguments (e.g. mute audio)
- Pass extra Selenium options / capabilities (e.g. eager page load strategy)
- Set native browser preferences (e.g. disable images)
from kameleo.local_api_client.models import BrowserSettings, Preference
client.profile.start_profile(profile.id, BrowserSettings(
arguments=["mute-audio"],
additional_options=[
Preference(key='pageLoadStrategy', value='eager'),
],
preferences=[
Preference(key='profile.managed_default_content_settings.images', value=2),
]
))
await client.profile.startProfile(profile.id, {
browserSettings: {
arguments: ["mute-audio"],
additionalOptions: [{ key: "pageLoadStrategy", value: "eager" }],
preferences: [{ key: "profile.managed_default_content_settings.images", value: 2 }],
},
});
using Kameleo.LocalApiClient.Model;
await client.Profile.StartProfileAsync(profile.Id, new BrowserSettings(
arguments: new List<string> { "mute-audio" },
additionalOptions: new List<Preference> {
new Preference("pageLoadStrategy", "eager"),
},
preferences: new List<Preference> {
new Preference("profile.managed_default_content_settings.images", 2),
}
));
3. Connect Selenium WebDriver
Point Selenium to http://localhost:{port}/webdriver and supply kameleo:profileId.
from selenium import webdriver
options = webdriver.ChromeOptions()
options.set_capability('kameleo:profileId', profile.id)
driver = webdriver.Remote(
command_executor='http://localhost:5050/webdriver',
options=options
)
import { Builder } from "selenium-webdriver";
const driver = await new Builder()
.usingServer("http://localhost:5050/webdriver")
.withCapabilities({ "kameleo:profileId": profile.id, browserName: "Kameleo" })
.build();
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Remote;
var remoteUri = new Uri("http://localhost:5050/webdriver");
var chromeOptions = new ChromeOptions();
chromeOptions.AddAdditionalOption("kameleo:profileId", profile.Id.ToString());
var driver = new RemoteWebDriver(remoteUri, chromeOptions);
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(3);
4. Run Selenium commands
driver.get('https://google.com')
await driver.get("https://google.com");
driver.Navigate().GoToUrl("https://google.com");
Option 2: Auto-start the profile (simpler)
Skip the explicit start call. Kameleo starts the profile automatically on the first WebDriver connection. Use this for quick scripts where default startup behavior is enough.
1. Create the profile (same as before, no start call later)
from kameleo.local_api_client import KameleoLocalApiClient
from kameleo.local_api_client.models import CreateProfileRequest
from selenium import webdriver
client = KameleoLocalApiClient(endpoint='http://localhost:5050')
client.verify_engine_ready()
fps = client.fingerprint.search_fingerprints(device_type='desktop', browser_product='chrome')
profile = client.profile.create_profile(CreateProfileRequest(
fingerprint_id=fps[0].id,
name='selenium auto-start example'
))
import { KameleoLocalApiClient } from "@kameleo/local-api-client";
import { Builder } from "selenium-webdriver";
const client = new KameleoLocalApiClient({ basePath: "http://localhost:5050" });
await client.verifyEngineReady();
const fps = await client.fingerprint.searchFingerprints("desktop", undefined, "chrome");
const profile = await client.profile.createProfile({ fingerprintId: fps[0].id, name: "selenium auto-start example" });
using Kameleo.LocalApiClient;
using Kameleo.LocalApiClient.Model;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Remote;
var client = new KameleoLocalApiClient(new Uri("http://localhost:5050"));
await client.VerifyEngineReadyAsync();
var fps = await client.Fingerprint.SearchFingerprintsAsync(deviceType: "desktop", browserProduct: "chrome");
var profile = await client.Profile.CreateProfileAsync(new CreateProfileRequest(fps[0].Id) { Name = "selenium auto-start example" });
2. Connect (auto-start happens here)
options = webdriver.ChromeOptions()
options.set_capability('kameleo:profileId', profile.id)
driver = webdriver.Remote(
command_executor='http://localhost:5050/webdriver',
options=options
)
driver.get('https://wikipedia.org')
const driver = await new Builder()
.usingServer("http://localhost:5050/webdriver")
.withCapabilities({ "kameleo:profileId": profile.id, browserName: "Kameleo" })
.build();
await driver.get("https://wikipedia.org");
var remoteUri = new Uri("http://localhost:5050/webdriver");
var chromeOptions = new ChromeOptions();
chromeOptions.AddAdditionalOption("kameleo:profileId", profile.Id.ToString());
var driver = new RemoteWebDriver(remoteUri, chromeOptions);
driver.Navigate().GoToUrl("https://wikipedia.org");
Cleanup (stop, export, delete)
Always stop the profile to persist its state. Optionally export it for backup or delete it to reclaim space.
Stop, export, or delete
import os
from kameleo.local_api_client.models import ExportProfileRequest
client.profile.stop_profile(profile.id)
export_path = f'{os.path.dirname(os.path.realpath(__file__))}/test.kameleo'
client.profile.export_profile(profile.id, body=ExportProfileRequest(path=export_path))
client.profile.delete_profile(profile.id)
await client.profile.stopProfile(profile.id);
await client.profile.exportProfile(profile.id, { body: { path: `${import.meta.dirname}/test.kameleo` } });
await client.profile.deleteProfile(profile.id);
using Kameleo.LocalApiClient.Model;
await client.Profile.StopProfileAsync(profile.Id);
await client.Profile.ExportProfileAsync(profile.Id, new ExportProfileRequest(Path.Combine(Environment.CurrentDirectory, "test.kameleo")));
await client.Profile.DeleteProfileAsync(profile.Id);