ern*_*rio 4 python selenium selenium-chromedriver raspberry-pi selenium-webdriver
我正在创建一个跨平台 python 脚本,它使用 selenium 执行一些命令。我有两个问题:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.utils import ChromeType
options = Options()
options.headless = True
options.add_experimental_option("excludeSwitches", ["enable-logging"])
driver = webdriver.Chrome(service=Service(ChromeDriverManager(chrome_type=ChromeType.CHROMIUM).install()), options=options)
driver.get("http://www.google.com")
print(driver.title)
Run Code Online (Sandbox Code Playgroud)
输出是:
pi@raspberrypi:~/Documents/Software $ /bin/python /home/pi/Documents/Software/test.py
====== WebDriver manager ======
Current chromium version is 95.0.4638
Get LATEST chromedriver version for 95.0.4638 chromium
There is no [linux32] chromedriver for browser in cache
Trying to download new driver from https://chromedriver.storage.googleapis.com/95.0.4638.69/chromedriver_linux32.zip
Traceback (most recent call last):
File "/home/pi/Documents/Software/test.py", line 10, in <module>
driver = webdriver.Chrome(service=Service(ChromeDriverManager(chrome_type=ChromeType.CHROMIUM).install()), options=options)
File "/home/pi/.local/lib/python3.9/site-packages/webdriver_manager/chrome.py", line 32, in install
driver_path = self._get_driver_path(self.driver)
File "/home/pi/.local/lib/python3.9/site-packages/webdriver_manager/manager.py", line 30, in _get_driver_path
file = download_file(driver.get_url(), driver.ssl_verify)
File "/home/pi/.local/lib/python3.9/site-packages/webdriver_manager/utils.py", line 98, in download_file
validate_response(response)
File "/home/pi/.local/lib/python3.9/site-packages/webdriver_manager/utils.py", line 80, in validate_response
raise ValueError("There is no such driver by url {}".format(resp.url))
ValueError: There is no such driver by url https://chromedriver.storage.googleapis.com/95.0.4638.69/chromedriver_linux32.zip
Run Code Online (Sandbox Code Playgroud)
谢谢
编辑:
问题不在于 webdriver 管理器,而在于 linux32 不存在 chromium 的 chromedrivers。事实上,在地址:“https://chromedriver.storage.googleapis.com/95.0.4638.69/chromedriver_linux32.zip”没有chromedriver,但是用linux64替换linux32会下载一个包,但与linux32不兼容。我不明白的是,如果 linux32 的 chromedrivers 不存在,那么为什么要使用以下命令安装它们:“sudo apt-get install chromium-chromedriver”,然后从代码中删除 webdriver-manager 调用,python 脚本是否有效?然后还有适用于 linux32 的 chromedriver,只是它们不存在于 chromedriver 主站点中。我使用的是带有 chromium 95.0.4638.69 的树莓派 3。
adu*_*ger 10
然而,Raspian 团队维护了兼容的 chromedriver 版本,因此为了使其正常工作,您需要:
为树莓派安装 chromedriver。例如对于 Linux:
sudo apt-get install chromium-chromedriver
Run Code Online (Sandbox Code Playgroud)
当你实例化你的驱动程序时,你需要告诉他在哪里可以找到这个chromedriver。另外,您还应该声明您使用 Chromium 而不是 Chrome(如果是这样):
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
options = Options()
# browser is Chromium instead of Chrome
options.BinaryLocation = "/usr/bin/chromium-browser"
# we use custom chromedriver for raspberry
driver_path = "/usr/bin/chromedriver"
driver = webdriver.Chrome(options=options, service=Service(driver_path))
Run Code Online (Sandbox Code Playgroud)
然后你就可以开始了:
driver.get("https://stackoverflow.com/")
Run Code Online (Sandbox Code Playgroud)
如果您需要适用于每个平台的代码,到目前为止我发现的最佳选择是将树莓派与其他系统区分开来:
import platform
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
options = Options()
# a few usefull options
options.add_argument("--disable-infobars")
options.add_argument("start-maximized")
options.add_argument("--disable-extensions")
options.add_argument("--headless") # if you want it headless
if platform.system() == "Linux" and platform.machine() == "armv7l":
# if raspi
options.BinaryLocation = ("/usr/bin/chromium-browser")
service = Service("/usr/bin/chromedriver")
else: # if not raspi and considering you're using Chrome
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(
service=service,
options=options
)
Run Code Online (Sandbox Code Playgroud)
考虑到您关于无需手动安装 Chrome 即可使 Selenium 工作的问题,您可能可以通过脚本安装 Chrome 以确保用户拥有它。它也适用于 Docker 使用,例如适用于 Linux amd64 环境的 DockerFile:
RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
RUN dpkg -i google-chrome-stable_current_amd64.deb; apt-get -fy instal
Run Code Online (Sandbox Code Playgroud)