Python 将selenium可执行文件移动到另一台计算机时,chrome驱动程序不在路径中

Python 将selenium可执行文件移动到另一台计算机时,chrome驱动程序不在路径中,python,selenium,selenium-webdriver,selenium-chromedriver,pyinstaller,Python,Selenium,Selenium Webdriver,Selenium Chromedriver,Pyinstaller,我使用Python和Selenium Web驱动程序编写了一个小的自动化脚本,并将其制作成一个可执行文件,可执行文件在我的计算机上运行良好,但当我在另一台计算机上尝试时,我发现chromedriver不在path中(注意:我使用addbinary命令包括chromedriver,并且两台计算机运行相同的操作系统:Mac OS) 我不太清楚为什么会发生这种情况,我的怀疑如下: 在我的.py代码中,我使用以下两行启动色度驱动程序 path = "/Users/sergio/chromedr

我使用Python和Selenium Web驱动程序编写了一个小的自动化脚本,并将其制作成一个可执行文件,可执行文件在我的计算机上运行良好,但当我在另一台计算机上尝试时,我发现
chromedriver
不在path中(注意:我使用
addbinary
命令包括
chromedriver
,并且两台计算机运行相同的操作系统:
Mac OS

我不太清楚为什么会发生这种情况,我的怀疑如下:

在我的
.py
代码中,我使用以下两行启动
色度驱动程序

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

但是我在添加二进制文件和数据文件时遇到了很多错误,包括
无法找到“/Users/sergio/usr/local/bin/chromedriver”

这让我想到
pyinstaller
会自动将
/Users/sergio
添加到给定的路径中,这使得我的路径错误,因此我不得不在
/Users/sergio
中使用一些内容,我尝试将
chromedriver
放入
应用程序中,但编译导致无法再次找到路径,对于一些r当路径为
/Users/sergio/chromedriver
时,easons编译工作正常,因此我使用了此路径,但代码不再工作(
chromedriver
未在路径中找到),因此我必须手动指定路径

现在我有点陷入了僵局,不知道该怎么办。任何帮助都将不胜感激。我希望我的解释足够清楚

我唯一的最终目标是编译我的selenium脚本并在其他计算机上运行它,而不让他们安装任何额外的东西,我不在乎应该如何完成,所以如果任何人有pyinstaller之外的解决方案,我不介意


更新:使用
--onefile
模式时,添加了一个赏金
pyinstaller
在执行exe期间将所有内容解压到临时目录中。请参阅答案和相关文章,了解如何获得正确的相对路径。您可能必须使用

path=resource\u path(“chromedriver”)
此外,您还可以在运行时直接将
chromedriver
添加到
PATH
环境变量中,这样就不必显式指定路径,只需调用
webdriver.Chrome()

os.environ[“PATH”]+=os.pathsep+资源路径(“chromedriver”)

pyinstaller
conciders
usr/local/bin/chromedriver:.
作为一个相对路径,因此添加
/Users/sergio
,试图使其成为绝对路径,请尝试使用不同的位置。无论如何,此位置并不重要,一旦找到此文件
pyinstaller
就会将其添加到已编译exe的根目录中,一个d在执行exe时解包。

处理chromedriver二进制文件的现代方法是使用。 首先,您需要安装管理器:

pip install webdriver-manager
然后使用它(用于Chrome):

在我的.NET核心项目中,我使用的不是我所描述的最现代的方法,而是最新的稳定NuGet。 基本上,nuget包含chromedriver,每次都会将其复制到程序集文件夹中(我的例子是\bin\Debug\netcoreapp3.1)。这是我在项目中的行:

"<PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="*" />"
参考文献:

将上述代码更改为以下格式

driver = webdriver.Chrome(executable_path='C:/Users/sergio/chromedriver.exe')

对于这个问题,有两个很好的解决方案:

1.安装软件包:

我最喜欢的和使用它的方式:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
2.启动远程Selenium Hub,并远程启动浏览器:

driver = webdriver.Remote(command_executor='ip_of_your_selenoid_instance:4444/wd/hub',desired_capabilities=DesiredCapabilities.CHROME)
3.您可以通过远程url启动并转到,该url将始终为本地主机:

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怎么样?这是主要问题。我的建议是在原始计算机上尝试我建议的两种方法之一。在这两种情况下,你都不需要指定chromedriver.exe的路径。这就是为什么我希望pyinstaller不会对该路径有问题。
driver = webdriver.Remote(command_executor='http://127.0.0.1:4444/wd/hub',desired_capabilities=DesiredCapabilities.CHROME)
docker run -d -p 4444:4444 selenium/standalone-chrome
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.yml

selenium:
  image: selenium/standalone-firefox
  ports:
  - 4444:4444