我用Python和Selenium Web Driver写了一个小的自动化脚本,我把它变成了一个可执行文件,可执行文件在我的计算机上工作得很好,但当我在另一台计算机上尝试它时,我得到了chromedriver
不在路径(注意):我使用add binary
命令包括chromedriver
,两台计算机运行相同的操作系统:Mac OS
)
我不太确定为什么会发生这种情况,我的怀疑如下:
在我的.py
代码中,我使用以下两行来启动chromedriver
path = "/Users/sergio/chromedriver"
driver = webdriver.Chrome(path)
然而,另一台计算机甚至没有这个路径,所以可能导致它甚至有这个路径。现在有人可能会建议简单地使用driver = webdriver.Chrome()
,但这里出现了更大的问题:我试图让我的chromedriver
在系统路径中,如/usr/local/bin
,当我这样做driver = webdriver.Chrome()
工作,但使用pyinstaller编译程序不工作,我运行:pyinstaller --onefile --noconsole --add-binary 'usr/local/bin/chromedriver:.' finalregtool.py
但我得到了很多错误,包括Unable to find "/Users/sergio/usr/local/bin/chromedriver" when adding binary and data files
这导致我认为pyinstaller
自动将/Users/sergio
添加到给定的路径,这使得我的路径错误,所以我不得不在/Users/sergio
内使用一些东西,我尝试将我的chromedriver
放在Applications
中,但编译导致无法再次找到路径,由于某些原因,当路径为/Users/sergio/chromedriver
时编译工作,所以我使用此路径,但代码不再工作(chromedriver
未在路径中找到),所以我不得不手动指定路径。
现在我有点陷入僵局,不知道该做什么。任何帮助都会很感激。我希望我的解释足够清楚。
我唯一的最终目标是编译我的selenium脚本并在其他计算机上运行它,而不需要他们安装任何额外的东西,我不在乎这应该如何完成,所以如果有人有pyinstaller之外的解决方案,我不介意。
更新:增加赏金
对于这个问题有几个很好的解决方案:
1。安装webdriver-manager包:
pip install webdriver-manager
我最喜欢的,像这样使用:
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
2。启动名为Selenoid的远程Selenium Hub并远程启动浏览器:
driver = webdriver.Remote(command_executor='ip_of_your_selenoid_instance:4444/wd/hub',desired_capabilities=DesiredCapabilities.CHROME)
3。你可以启动Chrome docker容器,也可以通过远程url,通常是localhost:
driver = webdriver.Remote(command_executor='http://127.0.0.1:4444/wd/hub',desired_capabilities=DesiredCapabilities.CHROME)
你需要启动一个独立的chrome浏览器:
docker run -d -p 4444:4444 selenium/standalone-chrome
,然后在python脚本中使用远程webdriver启动浏览器:
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
driver = webdriver.Remote("http://127.0.0.1:4444/wd/hub", DesiredCapabilities.CHROME)
docker-compose:
# docker-compose.yml
selenium:
image: selenium/standalone-firefox
ports:
- 4444:4444
pyinstaller
在使用--onefile
模式时,在执行exe期间将所有内容解包到临时目录中。参考这个答案和相关的帖子来了解如何获得正确的相对路径。您可能需要使用
path = resource_path("chromedriver")
同样,你可以在运行时直接将chromedriver
添加到PATH
环境变量,这样你就不必显式地指定路径,你可以简单地调用webdriver.Chrome()
os.environ["PATH"] += os.pathsep + resource_path("chromedriver")
pyinstaller
将usr/local/bin/chromedriver:.
视为相对路径,因此添加/Users/sergio
以使其成为绝对路径,请尝试使用不同的位置。无论如何,这个位置并不重要,一旦这个文件被找到,pyinstaller
将把它添加到编译后的exe的根目录中,并在exe执行时解压缩它。
处理chromedriver二进制文件的现代方法是使用WebDriverManager。首先,您需要安装管理器:
pip install webdriver-manager
然后你使用它(Chrome):
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
在我的。net Core项目中,我使用的不是我所描述的最现代的方法,而是最新稳定的NuGet,从这里https://www.nuget.org/packages/Selenium.WebDriver.ChromeDriver/。基本上,nuget包含chromedriver并每次将其复制到您的汇编文件夹(binDebugnetcoreapp3.1在我的情况下)。这是我项目中的一行:
"<PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="*" />"
星号表示将使用此处解释的最新(最高数量)稳定包。当然,你可以手动安装最新版本,然后在每2个主要的Chrome版本上更新NuGet包参考,使其与你的Chrome版本匹配。(87版chromedriver适用于87版和88版Chrome,但不适用于89版)。然后用以下行实例化驱动程序:
var driver = new ChromeDriver(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
参考资料:
错误信息:"'可执行文件需要在路径"https://www.automatetheplanet.com/webdriver-net50/
path = "/Users/sergio/chromedriver"
driver = webdriver.Chrome(path)
将上述代码更改为以下格式
driver = webdriver.Chrome(executable_path='C:/Users/sergio/chromedriver.exe')