浏览器选项
在 Selenium 3 中,功能通过使用 Desired Capabilities 类在会话中定义。从 Selenium 4 开始,您必须使用浏览器选项类。对于远程驱动会话,需要一个浏览器选项实例,因为它决定了将使用哪个浏览器。
这些选项在 w3c 规范的 功能 中描述。
每个浏览器都有 自定义选项,除了规范中定义的选项之外,还可以定义这些选项。
browserName
当使用 Options 类实例时,默认会设置浏览器名称。
ChromeOptions chromeOptions = new ChromeOptions();
String name = chromeOptions.getBrowserName();
options = webdriver.ChromeOptions()
assert options.capabilities['browserName'] == 'chrome'
options = Selenium::WebDriver::Options.chrome
browserVersion
此功能是可选的,它用于在远程端设置可用的浏览器版本。在最新版本的 Selenium 中,如果在系统上找不到该版本,Selenium Manager 将会自动下载。
ChromeOptions chromeOptions = new ChromeOptions();
String version = "latest";
chromeOptions.setBrowserVersion(version);
options = webdriver.ChromeOptions()
options.browser_version = 'stable'
assert options.capabilities['browserVersion'] == 'stable'
options.browser_version = 'latest'
pageLoadStrategy
有三种类型的页面加载策略可用。
页面加载策略查询 document.readyState,如下表所述
策略 | 就绪状态 | 备注 |
---|---|---|
normal | complete | 默认使用,等待所有资源下载完成 |
eager | interactive | DOM 访问已准备好,但其他资源(如图像)可能仍在加载 |
none | Any | 完全不阻止 WebDriver |
文档的 document.readyState
属性描述了当前文档的加载状态。
当通过 URL 导航到新页面时,默认情况下,WebDriver 将延迟完成导航方法(例如,driver.navigate().get()),直到文档就绪状态完成。这不一定意味着页面已完成加载,特别是对于像单页应用程序这样的站点,它们使用 JavaScript 在就绪状态返回完成后动态加载内容。另请注意,此行为不适用于单击元素或提交表单导致的导航。
如果由于下载对自动化不重要的资源(例如,图像、css、js)而导致页面加载时间过长,您可以将默认参数从 normal
更改为 eager
或 none
以加快会话速度。此值适用于整个会话,因此请确保您的 等待策略 足以最大限度地减少不稳定性。
normal (默认)
WebDriver 等待直到返回 load 事件触发。
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setPageLoadStrategy(PageLoadStrategy.NORMAL);
WebDriver driver = new ChromeDriver(chromeOptions);
options = webdriver.ChromeOptions()
options.page_load_strategy = 'normal'
driver = webdriver.Chrome(options=options)
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
namespace pageLoadStrategy {
class pageLoadStrategy {
public static void Main(string[] args) {
var chromeOptions = new ChromeOptions();
chromeOptions.PageLoadStrategy = PageLoadStrategy.Normal;
IWebDriver driver = new ChromeDriver(chromeOptions);
try {
driver.Navigate().GoToUrl("https://example.com");
} finally {
driver.Quit();
}
}
}
}
options = Selenium::WebDriver::Options.chrome
options.page_load_strategy = :normal
let driver = new Builder()
.forBrowser(Browser.CHROME)
.setChromeOptions(options.setPageLoadStrategy('normal'))
.build();
await driver.get('https://seleniumcn.cn/selenium/web/blank.html');
await driver.quit();
import org.openqa.selenium.PageLoadStrategy
import org.openqa.selenium.chrome.ChromeDriver
import org.openqa.selenium.chrome.ChromeOptions
fun main() {
val chromeOptions = ChromeOptions()
chromeOptions.setPageLoadStrategy(PageLoadStrategy.NORMAL)
val driver = ChromeDriver(chromeOptions)
try {
driver.get("https://www.google.com")
}
finally {
driver.quit()
}
}
eager
WebDriver 等待直到返回 DOMContentLoaded 事件触发。
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setPageLoadStrategy(PageLoadStrategy.EAGER);
WebDriver driver = new ChromeDriver(chromeOptions);
options = webdriver.ChromeOptions()
options.page_load_strategy = 'eager'
driver = webdriver.Chrome(options=options)
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
namespace pageLoadStrategy {
class pageLoadStrategy {
public static void Main(string[] args) {
var chromeOptions = new ChromeOptions();
chromeOptions.PageLoadStrategy = PageLoadStrategy.Eager;
IWebDriver driver = new ChromeDriver(chromeOptions);
try {
driver.Navigate().GoToUrl("https://example.com");
} finally {
driver.Quit();
}
}
}
}
options = Selenium::WebDriver::Options.chrome
options.page_load_strategy = :eager
let driver = new Builder()
.forBrowser(Browser.CHROME)
.setChromeOptions(options.setPageLoadStrategy('eager'))
.build();
await driver.get('https://seleniumcn.cn/selenium/web/blank.html');
await driver.quit();
import org.openqa.selenium.PageLoadStrategy
import org.openqa.selenium.chrome.ChromeDriver
import org.openqa.selenium.chrome.ChromeOptions
fun main() {
val chromeOptions = ChromeOptions()
chromeOptions.setPageLoadStrategy(PageLoadStrategy.EAGER)
val driver = ChromeDriver(chromeOptions)
try {
driver.get("https://www.google.com")
}
finally {
driver.quit()
}
}
none
WebDriver 仅等待直到初始页面下载完成。
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setPageLoadStrategy(PageLoadStrategy.NONE);
WebDriver driver = new ChromeDriver(chromeOptions);
options = webdriver.ChromeOptions()
options.page_load_strategy = 'none'
driver = webdriver.Chrome(options=options)
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
namespace pageLoadStrategy {
class pageLoadStrategy {
public static void Main(string[] args) {
var chromeOptions = new ChromeOptions();
chromeOptions.PageLoadStrategy = PageLoadStrategy.None;
IWebDriver driver = new ChromeDriver(chromeOptions);
try {
driver.Navigate().GoToUrl("https://example.com");
} finally {
driver.Quit();
}
}
}
}
options = Selenium::WebDriver::Options.chrome
options.page_load_strategy = :none
let driver = new Builder()
.forBrowser(Browser.CHROME)
.setChromeOptions(options.setPageLoadStrategy('none'))
.build();
await driver.get('https://seleniumcn.cn/selenium/web/blank.html');
await driver.quit();
import org.openqa.selenium.PageLoadStrategy
import org.openqa.selenium.chrome.ChromeDriver
import org.openqa.selenium.chrome.ChromeOptions
fun main() {
val chromeOptions = ChromeOptions()
chromeOptions.setPageLoadStrategy(PageLoadStrategy.NONE)
val driver = ChromeDriver(chromeOptions)
try {
driver.get("https://www.google.com")
}
finally {
driver.quit()
}
}
platformName
这标识了远程端的操作系统,获取 platformName
将返回操作系统名称。
在基于云的提供商中,设置 platformName
会在远程端设置操作系统。
ChromeOptions chromeOptions = new ChromeOptions();
String platform = "OS X 10.6";
chromeOptions.setPlatformName(platform);
options = webdriver.ChromeOptions()
options.platform_name = 'any'
driver = webdriver.Chrome(options=options)
options = Selenium::WebDriver::Options.firefox
options.platform_name = 'Windows 10'
acceptInsecureCerts
此功能检查在会话期间导航时是否使用了过期(或)无效的 TLS 证书
。
如果将功能设置为 false
,则当导航遇到任何域证书问题时,将返回 不安全证书错误。如果设置为 true
,浏览器将信任无效证书。
默认情况下,此功能将信任所有自签名证书。一旦设置,acceptInsecureCerts
功能将对整个会话产生影响。
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setAcceptInsecureCerts(true);
options = webdriver.ChromeOptions()
options.accept_insecure_certs = True
driver = webdriver.Chrome(options=options)
options = Selenium::WebDriver::Options.chrome
options.accept_insecure_certs = true
let driver = new Builder()
.forBrowser(Browser.CHROME)
.setChromeOptions(options.setAcceptInsecureCerts(true))
.build();
timeouts
WebDriver 会话
被施加了一定的 会话超时
时间间隔,在此期间用户可以控制执行脚本或从浏览器检索信息的行为。
每个会话超时都配置为下面描述的不同 超时
的组合
脚本超时
指定何时中断当前浏览上下文中执行的脚本。当 WebDriver 创建新会话时,将施加默认超时时间 30,000。
ChromeOptions chromeOptions = new ChromeOptions();
Duration duration = Duration.of(5, ChronoUnit.SECONDS);
chromeOptions.setScriptTimeout(duration);
options = webdriver.ChromeOptions()
options.timeouts = { 'script': 5000 }
driver = webdriver.Chrome(options=options)
options = Selenium::WebDriver::Options.chrome
options.timeouts = {script: 40_000}
页面加载超时
指定网页需要在当前浏览上下文中加载的时间间隔。当 WebDriver 创建新会话时,将施加默认超时时间 300,000。如果页面加载限制了给定的/默认时间范围,则脚本将因 TimeoutException 而停止。
ChromeOptions chromeOptions = new ChromeOptions();
Duration duration = Duration.of(5, ChronoUnit.SECONDS);
chromeOptions.setPageLoadTimeout(duration);
options = webdriver.ChromeOptions()
options.timeouts = { 'pageLoad': 5000 }
driver = webdriver.Chrome(options=options)
options = Selenium::WebDriver::Options.chrome
options.timeouts = {page_load: 400_000}
隐式等待超时
这指定了在定位元素时隐式元素定位策略的等待时间。当 WebDriver 创建新会话时,将施加默认超时时间 0。
ChromeOptions chromeOptions = new ChromeOptions();
Duration duration = Duration.of(5, ChronoUnit.SECONDS);
chromeOptions.setImplicitWaitTimeout(duration);
options = webdriver.ChromeOptions()
options.timeouts = { 'implicit': 5000 }
driver = webdriver.Chrome(options=options)
options = Selenium::WebDriver::Options.chrome
options.timeouts = {implicit: 1}
unhandledPromptBehavior
指定当前会话的 用户提示处理程序
的状态。默认为 拒绝并通知状态
用户提示处理程序
这定义了当在远程端遇到用户提示时必须采取的操作。这由 unhandledPromptBehavior
功能定义,并且具有以下状态
- dismiss
- accept
- dismiss and notify
- accept and notify
- ignore
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setUnhandledPromptBehaviour(UnexpectedAlertBehaviour.DISMISS_AND_NOTIFY);
options = webdriver.ChromeOptions()
options.unhandled_prompt_behavior = 'accept'
driver = webdriver.Chrome(options=options)
options = Selenium::WebDriver::Options.chrome
options.unhandled_prompt_behavior = :accept
setWindowRect
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setCapability(CapabilityType.SET_WINDOW_RECT, true);
options = webdriver.FirefoxOptions()
options.set_window_rect = True # Full support in Firefox
driver = webdriver.Firefox(options=options)
options = Selenium::WebDriver::Options.firefox
options.set_window_rect = true
strictFileInteractability
这个新的功能指示是否应该对 input type=file 元素应用严格的交互性检查。由于默认情况下严格的交互性检查是关闭的,因此在使用带有隐藏文件上传控件的 Element Send Keys 时,行为会发生变化。
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setCapability(CapabilityType.STRICT_FILE_INTERACTABILITY, true);
options = webdriver.ChromeOptions()
options.strict_file_interactability = True
driver = webdriver.Chrome(options=options)
options = Selenium::WebDriver::Options.chrome
options.strict_file_interactability = true
proxy
代理服务器充当客户端和服务器之间请求的中介。简单来说,流量通过代理服务器到达您请求的地址并返回。
使用 Selenium 的自动化脚本的代理服务器可能有助于
- 捕获网络流量
- 模拟网站进行的后端调用
- 在复杂的网络拓扑或严格的公司限制/政策下访问所需的网站。
如果您在公司环境中,并且浏览器无法连接到 URL,则很可能是因为环境需要通过代理才能访问。
Selenium WebDriver 提供了一种代理设置方式
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
public class ProxyTest {
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.setHttpProxy("<HOST:PORT>");
ChromeOptions options = new ChromeOptions();
options.setCapability("proxy", proxy);
WebDriver driver = new ChromeDriver(options);
driver.get("https://www.google.com/");
driver.manage().window().maximize();
driver.quit();
}
}
options = webdriver.ChromeOptions()
options.proxy = Proxy({ 'proxyType': ProxyType.MANUAL, 'httpProxy' : 'http.proxy:1234'})
driver = webdriver.Chrome(options=options)
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
public class ProxyTest{
public static void Main() {
ChromeOptions options = new ChromeOptions();
Proxy proxy = new Proxy();
proxy.Kind = ProxyKind.Manual;
proxy.IsAutoDetect = false;
proxy.SslProxy = "<HOST:PORT>";
options.Proxy = proxy;
options.AddArgument("ignore-certificate-errors");
IWebDriver driver = new ChromeDriver(options);
driver.Navigate().GoToUrl("https://seleniumcn.cn/");
}
}
options = Selenium::WebDriver::Options.chrome
options.proxy = Selenium::WebDriver::Proxy.new(http: 'myproxy.com:8080')
let webdriver = require('selenium-webdriver');
let chrome = require('selenium-webdriver/chrome');
let proxy = require('selenium-webdriver/proxy');
let opts = new chrome.Options();
(async function example() {
opts.setProxy(proxy.manual({http: '<HOST:PORT>'}));
let driver = new webdriver.Builder()
.forBrowser('chrome')
.setChromeOptions(opts)
.build();
try {
await driver.get("https://seleniumcn.cn");
}
finally {
await driver.quit();
}
}());
import org.openqa.selenium.Proxy
import org.openqa.selenium.WebDriver
import org.openqa.selenium.chrome.ChromeDriver
import org.openqa.selenium.chrome.ChromeOptions
class proxyTest {
fun main() {
val proxy = Proxy()
proxy.setHttpProxy("<HOST:PORT>")
val options = ChromeOptions()
options.setCapability("proxy", proxy)
val driver: WebDriver = ChromeDriver(options)
driver["https://www.google.com/"]
driver.manage().window().maximize()
driver.quit()
}
}