Chrome 特定功能
預設情況下,Selenium 4 與 Chrome v75 及更高版本相容。請注意,Chrome 瀏覽器版本和 chromedriver 版本的主要版本必須相符。
選項
所有瀏覽器通用的功能都描述在選項頁面上。
Chrome 和 Chromium 獨有的功能記錄在 Google 的功能與 ChromeOptions頁面上
使用基本定義的選項啟動 Chrome 工作階段看起來像這樣
ChromeOptions options = new ChromeOptions();
driver = new ChromeDriver(options);
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=options)
var options = new ChromeOptions();
driver = new ChromeDriver(options);
options = Selenium::WebDriver::Options.chrome
@driver = Selenium::WebDriver.for :chrome, options: options
const Options = new Chrome.Options();
let driver = new Builder()
.forBrowser(Browser.CHROME)
.setChromeOptions(Options)
.build();
參數
args
參數是用於瀏覽器啟動時要使用的一系列命令行開關。以下是兩個用於研究這些參數的絕佳資源
常用的 args 包括 --start-maximized
、--headless=new
和 --user-data-dir=...
新增參數到選項
options.addArguments("--start-maximized");
options.add_argument("--start-maximized")
options.AddArgument("--start-maximized");
options.args << '--start-maximized'
let driver = new Builder()
.forBrowser(Browser.CHROME)
.setChromeOptions(options.addArguments('--headless=new'))
.build();
在指定位置啟動瀏覽器
binary
參數接受要使用的瀏覽器替代位置路徑。透過此參數,您可以使用 chromedriver 來驅動各種基於 Chromium 的瀏覽器。
新增瀏覽器位置到選項
options.setBinary(getChromeLocation());
options.binary_location = chrome_bin
options.BinaryLocation = GetChromeLocation();
options.binary = chrome_location
let driver = new Builder()
.forBrowser(Browser.CHROME)
.setChromeOptions(options.setChromeBinaryPath(`Path to chrome binary`))
.build();
新增擴充功能
extensions
參數接受 crx 檔案。至於未封裝的目錄,請改用 load-extension
參數,如這篇文章中所述。
新增擴充功能到選項
options.addExtensions(extensionFilePath);
options.add_extension(extension_file_path)
options.AddExtension(extensionFilePath);
options.add_extension(extension_file_path)
const options = new Chrome.Options();
let driver = new Builder()
.forBrowser(Browser.CHROME)
.setChromeOptions(options.addExtensions(['./test/resources/extensions/webextensions-selenium-example.crx']))
.build();
保持瀏覽器開啟
將 detach
參數設定為 true 將在程序結束後保持瀏覽器開啟,只要未向驅動程式發送 quit 命令。
注意:這已經是 Java 中的預設行為。
options.add_experimental_option("detach", True)
注意:這已經是 .NET 中的預設行為。
options.detach = true
let driver = new Builder()
.forBrowser(Browser.CHROME)
.setChromeOptions(options.detachDriver(true))
.build();
排除參數
Chromedriver 有幾個預設參數用於啟動瀏覽器。如果您不希望新增這些參數,請將它們傳遞到 excludeSwitches
。一個常見的範例是重新開啟彈出視窗封鎖程式。預設參數的完整列表可以從Chromium 原始碼中解析。
在選項上設定排除的參數
options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking"));
options.add_experimental_option('excludeSwitches', ['disable-popup-blocking'])
options.AddExcludedArgument("disable-popup-blocking");
options.exclude_switches << 'disable-popup-blocking'
let driver = new Builder()
.forBrowser(Browser.CHROME)
.setChromeOptions(options.excludeSwitches('enable-automation'))
.build();
服務
有關建立預設 Service 物件,以及設定驅動程式位置和端口的範例,請參閱驅動程式服務頁面。
記錄輸出
取得驅動程式日誌對於偵錯問題很有幫助。Service 類別可讓您指定日誌的去向。除非使用者指示,否則記錄輸出會被忽略。
檔案輸出
若要變更記錄輸出以儲存到特定檔案
ChromeDriverService service =
new ChromeDriverService.Builder().withLogFile(logLocation).build();
注意:Java 也允許透過系統屬性設定檔案輸出
屬性鍵:ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY
屬性值:表示日誌檔案路徑的字串
service.LogPath = GetLogLocation();
主控台輸出
若要變更記錄輸出以在主控台中顯示為 STDOUT
ChromeDriverService service =
new ChromeDriverService.Builder().withLogOutput(System.out).build();
注意:Java 也允許透過系統屬性設定主控台輸出;
屬性鍵:ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY
屬性值:DriverService.LOG_STDOUT
或 DriverService.LOG_STDERR
記錄層級
有 6 個可用的記錄層級:ALL
、DEBUG
、INFO
、WARNING
、SEVERE
和 OFF
。請注意,--verbose
等同於 --log-level=ALL
,而 --silent
等同於 --log-level=OFF
,因此此範例僅通用地設定記錄層級
ChromeDriverService service =
new ChromeDriverService.Builder().withLogLevel(ChromiumDriverLogLevel.DEBUG).build();
注意:Java 也允許透過系統屬性設定記錄層級
屬性鍵:ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY
屬性值:ChromiumDriverLogLevel
列舉的字串表示形式
service = webdriver.ChromeService(service_args=['--log-level=DEBUG'], log_output=subprocess.STDOUT)
記錄檔功能
有 2 個功能僅在記錄到檔案時可用
- 附加日誌
- 可讀的時間戳記
若要使用它們,您還需要明確指定日誌路徑和記錄層級。日誌輸出將由驅動程式而非程序管理,因此可能會看到細微的差異。
ChromeDriverService service =
new ChromeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build();
注意:Java 也允許透過系統屬性切換這些功能
屬性鍵:ChromeDriverService.CHROME_DRIVER_APPEND_LOG_PROPERTY
和 ChromeDriverService.CHROME_DRIVER_READABLE_TIMESTAMP
屬性值:"true"
或 "false"
service = webdriver.ChromeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path)
service.args << '--append-log'
service.args << '--readable-timestamp'
停用建置檢查
Chromedriver 和 Chrome 瀏覽器版本應相符,如果不相符,驅動程式將會錯誤。如果您停用建置檢查,您可以強制驅動程式與任何版本的 Chrome 一起使用。請注意,這是不受支援的功能,並且不會調查錯誤。
ChromeDriverService service =
new ChromeDriverService.Builder().withBuildCheckDisabled(true).build();
注意:Java 也允許透過系統屬性停用建置檢查
屬性鍵:ChromeDriverService.CHROME_DRIVER_DISABLE_BUILD_CHECK
屬性值:"true"
或 "false"
service = webdriver.ChromeService(service_args=['--disable-build-check'], log_output=subprocess.STDOUT)
service.DisableBuildCheck = true;
特殊功能
某些瀏覽器實作了它們獨有的其他功能。
投放
您可以驅動 Chrome Cast 裝置,包括共享分頁
List<Map<String, String>> sinks = driver.getCastSinks();
if (!sinks.isEmpty()) {
String sinkName = sinks.get(0).get("name");
driver.startTabMirroring(sinkName);
driver.stopCasting(sinkName);
}
sinks = driver.get_sinks()
if sinks:
sink_name = sinks[0]['name']
driver.start_tab_mirroring(sink_name)
driver.stop_casting(sink_name)
sinks = @driver.cast_sinks
unless sinks.empty?
device_name = sinks.first['name']
@driver.start_cast_tab_mirroring(device_name)
expect { @driver.stop_casting(device_name) }.not_to raise_exception
end
網路條件
您可以模擬各種網路條件。
ChromiumNetworkConditions networkConditions = new ChromiumNetworkConditions();
networkConditions.setOffline(false);
networkConditions.setLatency(java.time.Duration.ofMillis(20)); // 20 ms of latency
networkConditions.setDownloadThroughput(2000 * 1024 / 8); // 2000 kbps
networkConditions.setUploadThroughput(2000 * 1024 / 8); // 2000 kbps
((ChromeDriver) driver).setNetworkConditions(networkConditions);
network_conditions = {
"offline": False,
"latency": 20, # 20 ms of latency
"download_throughput": 2000 * 1024 / 8, # 2000 kbps
"upload_throughput": 2000 * 1024 / 8, # 2000 kbps
}
driver.set_network_conditions(**network_conditions)
@driver.network_conditions = {offline: false, latency: 100, throughput: 200}
日誌
LogEntries logs = driver.manage().logs().get(LogType.BROWSER);
logs = driver.get_log("browser")
logs = @driver.logs.get(:browser)
權限
driver.setPermission("camera", "denied");
driver.set_permissions('camera', 'denied')
@driver.add_permission('camera', 'denied')
@driver.add_permissions('clipboard-read' => 'denied', 'clipboard-write' => 'prompt')
DevTools
有關使用 Chrome DevTools 的更多資訊,請參閱Chrome DevTools 章節