首先,我知道这个问题在这里被问了很多。只是明确表示我已经阅读了大多数接受的答案并正确遵循了所有步骤,仍然收到有关问题中的此错误。 这是我下面的脚本以及所有其他信息
[ 我正在使用带有 chromedriver 的硒,试图在运行 ubuntu 20 的无头模式下将其与 chromium 浏览器一起使用 ]
猫 test.py
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.binary_location = '/usr/bin/chromium-browser'
driver = webdriver.Chrome(options=options, executable_path='/usr/local/bin/chromedriver')
driver.get("https://www.google.com")
print(driver.title)
print ("Headless Chrome Initialized")
driver.quit()
蟒蛇3 test.py
Traceback (most recent call last):
File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/common/service.py", line 72, in start self.process = subprocess.Popen(cmd, env=self.env,
File "/usr/lib/python3.8/subprocess.py", line 854, in __init__ self._execute_child(args, executable, preexec_fn, close_fds,
File "/usr/lib/python3.8/subprocess.py", line 1702, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: '/usr/local/bin/chromedriver'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "test.py", line 9, in <module>
driver = webdriver.Chrome(options=options, executable_path='/usr/local/bin/chromedriver')
File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/chrome/webdriver.py", line 73, in __init__
self.service.start()
File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/common/service.py", line 81, in start
raise WebDriverException(
selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home
我遵循了哪些步骤
sudo apt install chromium-browser
python3 -m pip install selenium
wget https://chromedriver.storage.googleapis.com/83.0.4103.39/chromedriver_linux64.zip
unzip chromedriver*
chmod +x chromedriver
sudo mv chromedriver /usr/local/bin/
sudo chown root:root /usr/local/bin/chromedriver
sudo chmod 0755 /usr/local/bin/chromedriver
一起验证一切
╭─[localhost] as xd003 in ~
╰─➤ lsb_release -a | grep Description &&
apt -qq list python3 &&
apt -qq list chromium-browser &&
which chromedriver &&
which chromium-browser &&
echo $PATH
No LSB modules are available.
Description: Ubuntu 20.04 LTS
python3/focal,now 3.8.2-0ubuntu2 arm64 [installed]
chromium-browser/focal-updates,now 81.0.4044.129-0ubuntu0.20.04.1 arm64 [installed]
/usr/local/bin/chromedriver
/usr/bin/chromium-browser
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
一切看起来都很好,有人可以建议我做错了什么吗?
我在本地运行的 Ubuntu20 是我在安卓设备上使用的 Ubuntu Proot
经过几天的弄清楚,我终于能够修复这个错误。
所以正如我所提到的,我在Android设备上运行Proot Ubuntu 20。现在这里的 linux 内核架构是 aarch64 似乎不受官方 chrome 网络驱动程序的支持 - https://chromedriver.chromium.org
要解决此问题,只需下载为arm64变体编译的chromedriver。您可以随时从这里获得最新的 - https://github.com/electron/electron/releases
简而言之,其他一切都很完美,只需要用 - https://github.com/electron/electron/releases/download/v8.3.4/chromedriver-v8.3.4-linux-arm64.zip 替换 wget 链接
PS/也许如果错误是这样的 - 不支持 linux 内核架构 ,修复它会容易得多,但没关系。
- chromedriver 我总是传递给构造函数
- 如果找不到,则会发生 PATH 错误(请参阅下面的示例,我故意传递不正确的参数(
- 此驱动程序不适用于铬,仅适用于铬。 因此,有理由将驱动程序与
/usr/bin
目录分开
import time, os, datetime, json, requests, re, subprocess
from distutils.version import StrictVersion
from pathlib import Path
import xmlplain
import selenium
from selenium import webdriver
def get_release(v):
r = re.compile(f'^(83.[0-9]+.[0-9]+).*linux.*$')
maxrel = "0.0.0"
pos = 0
for i, rel in enumerate(v):
if r.match(rel) is not None and StrictVersion(r.split(rel)[1]) > StrictVersion(maxrel):
maxrel = r.split(rel)[1]
pos = i
return v[pos]
def cmd(cmd:str, assertfail=True) :
up = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True)
str = [l.rstrip().decode() for l in up.stdout]
exitcode = up.wait()
if assertfail: assert exitcode == 0, f"[{exitcode}] {cmd} {str}"
return exitcode, str
if __name__ == '__main__':
# os.environ["DISPLAY"] = ":0.0"
# find latest driver available
resp = requests.get("https://chromedriver.storage.googleapis.com")
raw = xmlplain.xml_to_obj(resp.content, strip_space=True, fold_dict=False)
v = get_release([e["Contents"][0]["Key"] for e in raw["ListBucketResult"] if "Contents" in e.keys()])
# download if required
if not Path.cwd().joinpath(v.split("/")[0]).is_dir():
cmd(f"mkdir {v.split('/')[0]}")
cmd(f"wget https://chromedriver.storage.googleapis.com/{v} -O {v}")
cmd(f"unzip {v} -d {v.split('/')[0]}/")
# hit a webpage
try:
driver = webdriver.Chrome(f"unknown/chromedriver") # Optional argument, if not specified will search path.
except selenium.common.exceptions.WebDriverException as e:
print(e)
options = webdriver.ChromeOptions()
options.add_argument('--no-sandbox')
options.add_argument('--headless')
options.add_argument('--disable-dev-shm-usage')
options.binary_location = '/usr/bin/chromium-browser'
options.binary_location = '/usr/bin/google-chrome'
driver = webdriver.Chrome(f"{v.split('/')[0]}/chromedriver", options=options) # Optional argument, if not specified will search path.
driver.get('https://www.google.com')
print(driver.title)
print ("Headless Chrome Initialized")
driver.quit()
输出:
Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home
Google
Headless Chrome Initialized