适用于 linux32 的 Chromedriver 不存在 - Python Selenium Chromedriver

ern*_*rio 4 python selenium selenium-chromedriver raspberry-pi selenium-webdriver

我正在创建一个跨平台 python 脚本,它使用 selenium 执行一些命令。我有两个问题:

  1. 为什么以下脚本可以在 Windows 上运行,但不能在 Raspberry pi OS 32 位上运行?唯一有效的方法是删除 webdriver-manager,但这需要手动安装 webdriver。我用的是树莓派3
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)
  1. 如何创建一个在无头模式下使用 selenium webdriver 并在每个平台上工作的 python 脚本?我的意思是,如果我在脚本中使用 chromewebdriver,则使用该脚本的用户必须安装 chrome,如果是 Firefox,则用户必须安装 Firefox。是否有无需安装外部脚本即可运行的网络驱动程序?

谢谢

编辑:

问题不在于 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

  1. 由于官方团队没有开发 linux32 chromedriver(例如https://chromedriver.storage.googleapis.com/index.html?path=99.0.4844.17/),因此您无法使用 webdriver_manager 因为它正在查看他们的存储库。

然而,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)
  1. 如果您需要适用于每个平台的代码,到目前为止我发现的最佳选择是将树莓派与其他系统区分开来:

    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)