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



我用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")

pyinstallerusr/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')

相关内容

  • 没有找到相关文章

最新更新