解决R Selenium Chrome版本不匹配:安装并使用Chromium
问题描述
我使用R编写的Selenium脚本在2023年8月前可正常运行,但11月开始报错。相关脚本及错误信息如下:
原运行脚本
library(RSelenium) library(wdman) library(netstat) selenium() # checking Selenium Server versions: #BEGIN: PREDOWNLOAD #BEGIN: DOWNLOAD #BEGIN: POSTDOWNLOAD #.... #BEGIN: DOWNLOAD #BEGIN: POSTDOWNLOAD #$process #PROCESS 'file27547a8c5781.bat', running, pid 14124. binman::list_versions("chromedriver") #$win32 #[1] "113.0.5672.63" "114.0.5735.16" "114.0.5735.90" seleium_object <- selenium(retcommand = T, check = F) remote_driver <- rsDriver(browser = "chrome", chromever = "119.0.6045.105", verbose = F, port = free_port())
报错信息
Error in chrome_ver(chromecheck[["platform"]], chromever) : version requested doesnt match versions available = 113.0.5672.63,114.0.5735.16,114.0.5735.90
后续待执行脚本(当前无法运行)
# rest of R/selenium script (currently does not work) #remDr = remote_driver #remDr$navigate("https://www.google.com/maps") # Search for the CN Tower #search_box <- remDr$findElement(using = 'css selector', "#searchboxinput") #search_box$sendKeysToElement(list("CN Tower", key = "enter")) #Sys.sleep(5) # Get the URL of the current page #url <- remDr$getCurrentUrl()[[1]] # Extract the longitude and latitude from the URL #long_lat <- gsub(".*@(-?[0-9.]+),(-?[0-9.]+),.*", "\1,\2", url) #long_lat <- unlist(strsplit(long_lat, ","))
已知使用Chromium替代Google Chrome可解决版本匹配问题,但不清楚如何通过R命令安装Chromium,以及如何修改脚本适配Chromium。
解决步骤
一、通过R命令安装Chromium
Windows系统
调用system()执行winget命令完成安装:
# 安装Chromium system("winget install -e --id Google.Chromium", wait = TRUE) # 验证安装 system("winget list Google.Chromium", wait = TRUE)
Linux(Debian/Ubuntu)
# 安装Chromium system("sudo apt install chromium-browser -y", wait = TRUE) # 验证安装 system("chromium-browser --version", wait = TRUE)
MacOS
# 安装Chromium(需先安装Homebrew) system("brew install chromium", wait = TRUE) # 验证安装 system("chromium --version", wait = TRUE)
二、修改R Selenium脚本适配Chromium
library(RSelenium) library(wdman) library(netstat) # -------------------------- # 1. 获取Chromium版本并匹配驱动 # -------------------------- # Windows系统获取版本 chromium_version <- system("wmic datafile where name='C:\\Program Files\\Chromium\\Application\\chrome.exe' get Version /value", intern = TRUE) chromium_version <- gsub("Version=", "", chromium_version[grepl("Version=", chromium_version)]) # Linux系统替换为:system("chromium-browser --version", intern = TRUE) # MacOS系统替换为:system("chromium --version", intern = TRUE) # 提取主版本号,让wdman自动匹配对应chromedriver chromium_major_version <- strsplit(chromium_version, "\\.")[[1]][1] # -------------------------- # 2. 启动适配Chromium的Selenium驱动 # -------------------------- remote_driver <- rsDriver( browser = "chrome", chromever = chromium_major_version, verbose = FALSE, port = free_port(), extraCapabilities = list( chromeOptions = list( # 根据系统替换Chromium路径 # Windows: "C:\\Program Files\\Chromium\\Application\\chrome.exe" # Linux: "/usr/bin/chromium-browser" # MacOS: "/Applications/Chromium.app/Contents/MacOS/Chromium" binary = "C:\\Program Files\\Chromium\\Application\\chrome.exe" ) ) ) # -------------------------- # 3. 执行原有业务逻辑 # -------------------------- remDr <- remote_driver$client remDr$navigate("https://www.google.com/maps") # 搜索CN Tower search_box <- remDr$findElement(using = 'css selector', "#searchboxinput") search_box$sendKeysToElement(list("CN Tower", key = "enter")) Sys.sleep(5) # 获取当前页面URL url <- remDr$getCurrentUrl()[[1]] # 提取经纬度(修复转义符问题) long_lat <- gsub(".*@(-?[0-9.]+),(-?[0-9.]+),.*", "\\1,\\2", url) long_lat <- unlist(strsplit(long_lat, ",")) # -------------------------- # 4. 关闭资源 # -------------------------- remDr$close() remote_driver$server$stop()
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

