在过去的一周里,我一直在努力让 Selenium 在我刚刚安装了 Ubuntu 的笔记本电脑上正常运行,只是为了处理个人项目。我没有从 Google 搜索中找到任何好的解决方案,大多数结果都是 5 年前的结果,甚至较新的示例也不起作用。
我已经完成了基本的故障排除。最重要的是,我浏览了源代码并让它暂停并打印出信息以确保它们是正确的。这些都没有帮助,甚至没有从here获取selenium管理器可执行文件,并将其放入selenium_manager.py脚本期望的位置。
我有几个不同版本的测试文件,放在下面:
from selenium import webdriver
browser = webdriver.Firefox()
from selenium import webdriver
opt = webdriver.FirefoxOptions()
drv = webdriver.firefox.service.Service()
drv.path = "/snap/bin/firefox"
opt.binary_location = '/snap/bin/firefox.geckodriver'
browser = webdriver.Firefox(options=opt, service=drv)
browser.get("http://www.example.com")
我在测试这些和编辑源代码时遇到的错误消息是:
selenium.common.exceptions.NoSuchDriverException: Message: Unable to obtain driver for firefox using Selenium Manager. selenium.common.exceptions.WebDriverException: Message: Unable to obtain working Selenium Manager binary; /usr/lib/python3/dist-packages/selenium/webdriver/common/linux/selenium-manager
selenium.common.exceptions.InvalidArgumentException: Message: binary is not a Firefox executable
selenium.common.exceptions.WebDriverException: Message: Can not connect to the Service /snap/bin/geckodriver/snap/bin/geckodriver selenium.common.exceptions.WebDriverException: Message: Can not connect to the Service /snap/bin/firefox/snap/bin/firefox
我终于在 Selenium 的 github 存储库的已关闭问题部分找到并回答了https://github.com/SeleniumHQ/selenium/issues/13252#issuecomment-1845021270 由 jn-chrn 发布。
他的工作片段转载如下。
import logging
import selenium.webdriver
import selenium.webdriver.firefox.service
logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
firefox_bin = "/snap/firefox/current/usr/lib/firefox/firefox"
firefoxdriver_bin = "/snap/firefox/current/usr/lib/firefox/geckodriver"
options = selenium.webdriver.firefox.options.Options()
options.add_argument('--headless')
options.binary_location = firefox_bin
service = selenium.webdriver.firefox.service.Service(executable_path=firefoxdriver_bin)
browser = selenium.webdriver.Firefox(service=service, options=options)
我可以看到路径名完全不同,深入到快照目录中。 jn-chrn 有点说明了原因,但没有详细说明。原因似乎是 Firefox 的 snap 版本将原始可执行文件移出了 PATH,并且尝试仅根据文件名查找它的脚本不起作用。
在两条路径上运行
file
表明selenium不适用于这些符号链接,它们都只是指向/usr/bin/snap/
!
$ file /snap/bin/firefox
/snap/bin/firefox: symbolic link to /usr/bin/snap
$ file /snap/firefox/current/usr/lib/firefox/firefox
/snap/firefox/current/usr/lib/firefox/firefox: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=fbd297b89a7b29cc2ab8dbd9a0135e0d31f9f046, stripped
$ file /snap/bin/firefox.geckodriver
/snap/bin/firefox.geckodriver: symbolic link to /usr/bin/snap
$ file /snap/firefox/current/usr/lib/firefox/geckodriver
/snap/firefox/current/usr/lib/firefox/geckodriver: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=1e8e38e794486bf4d9009b8a541b66cbbdaa5a00, with debug_info, not stripped
由于我确实花了一些时间查看源代码,所以我知道类型没有使用 bash 实用程序
file
进行验证,而是使用 pathlib 的 is_file 函数进行验证。编辑脚本来检查 is_symlink 可能是一个有趣的挑战。该脚本可能还应该专门检查浏览器的 snap 版本是否正在运行。
$ file /usr/bin/snap
/usr/bin/snap: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=lJlrGZagTFQfotOw8hPQ/vEjk2Ktx9WH8rGhyIse-/VJS-j7kGZdr1_Lt919uh/cYxQiA18LNnhcSU3-jNg, stripped
snap 可执行文件似乎可能使用符号链接的名称来启动正确的程序?不完全确定,但这很有趣。我想知道这是否意味着如果符号链接实际上指向正确的文件,它们就可以正常运行?