Python 将selenium可执行文件移动到另一台计算机时,chrome驱动程序不在路径中
我使用Python和Selenium Web驱动程序编写了一个小的自动化脚本,并将其制作成一个可执行文件,可执行文件在我的计算机上运行良好,但当我在另一台计算机上尝试时,我发现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
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
concidersusr/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