DesiredCapabilities
is a class in Selenium WebDriver that is used to set the properties of browsers before initiating a new browser session. The capabilities of a browser define its behavior and how it is expected to execute tests. While the use of DesiredCapabilities
has been common in earlier versions of Selenium WebDriver, it is important to note that with the introduction of the W3C WebDriver protocol, the use of DesiredCapabilities
has been largely superseded by Options
classes for each browser (e.g., ChromeOptions
, FirefoxOptions
).
The DesiredCapabilities
class allows you to specify browser-specific options that can include things like:
- Browser name (e.g., Chrome, Firefox, Internet Explorer)
- Platform (e.g., Windows, Linux, macOS)
- Version of the browser
- Whether JavaScript should be enabled
- Proxy settings
- Timeouts and delays
- Logging preferences
For example, if you wanted to set the capabilities to use a proxy server with Chrome, you could do so using the DesiredCapabilities
class as follows (in Selenium 3):
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
# Set proxy settings
proxy = "127.0.0.1:8080"
capabilities = DesiredCapabilities.CHROME.copy()
capabilities['proxy'] = {
"httpProxy": proxy,
"ftpProxy": proxy,
"sslProxy": proxy,
"proxyType": "MANUAL",
}
# Initialize the WebDriver with the desired capabilities
driver = webdriver.Chrome(desired_capabilities=capabilities)
# Now you can use the driver to navigate to pages with the proxy settings applied
driver.get("http://example.com")
In Selenium 4, you are encouraged to use the browser-specific Options
classes instead of DesiredCapabilities
. Here's how you would achieve the same proxy setup with ChromeOptions
:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# Set proxy settings
proxy = "127.0.0.1:8080"
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server={proxy}')
# Initialize the WebDriver with the Chrome options
driver = webdriver.Chrome(options=chrome_options)
# Now you can use the driver to navigate to pages with the proxy settings applied
driver.get("http://example.com")
As you can see, the newer Options
approach is more straightforward and better aligned with the current direction of Selenium WebDriver development. It is recommended to use the Options
classes when working with Selenium 4 and newer.
For those using other languages or needing to work with remote WebDriver instances (such as a Selenium Grid), the concept of capabilities still applies, and they can be sent as part of the session initialization request to inform the remote server of the desired configuration for the browser session.
Here's an example of how you might specify capabilities for a remote session using Java:
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import java.net.URL;
public class RemoteTest {
public static void main(String[] args) throws Exception {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("browserName", "chrome");
capabilities.setCapability("platform", "WINDOWS");
RemoteWebDriver driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capabilities);
driver.get("http://example.com");
// Your test code here
driver.quit();
}
}
However, even in Java, with the introduction of Selenium 4, you are encouraged to use the Options
classes and then convert those to Capabilities
if needed for a remote session.