我正在尝试使用Selenium和.NET Core构建一个网页爬取应用程序,但我在找到WebDriver的exe文件方面遇到了困难。
我的项目中有一个.csproj,用于运行API,其中调用(除其他外)另一个.csproj来处理网页爬取。所有都在一个.sln中运行,且都使用.NET Core 2.1。
在爬取项目中,我已经通过nuget安装了Selenium.WebDriver和Selenium.WebDriver.ChromeDriver。
我在API中创建了一个端点,该端点调用爬取项目,并运行一个方法来尝试调用new ChromeDriver()。但是它没有起作用:( 特别是,我得到了以下错误消息:
通过观察重建期间的更改以及在线研究,我发现:
我的项目中有一个.csproj,用于运行API,其中调用(除其他外)另一个.csproj来处理网页爬取。所有都在一个.sln中运行,且都使用.NET Core 2.1。
在爬取项目中,我已经通过nuget安装了Selenium.WebDriver和Selenium.WebDriver.ChromeDriver。
我在API中创建了一个端点,该端点调用爬取项目,并运行一个方法来尝试调用new ChromeDriver()。但是它没有起作用:( 特别是,我得到了以下错误消息:
The chromedriver.exe file does not exist in the current directory or in a directory on the PATH environment variable. The driver can be downloaded at ... <url>
看起来很清楚(尽管令人失望的是它没有告诉你“当前目录”是什么意思。我将立即提交一个PR来解决这个问题)
通过观察重建期间的更改以及在线研究,我发现:
- 所有Nuget包中的
dll
和exe
都存储在全局Nuget缓存中,而不是解决方案目录中的nugetpackages
文件夹。- 这似乎是预期行为:dotnet Std中提出的“错误”;MSDN迁移文档。
chromedriver.exe
似乎被复制到<solutionFolder>\<ScrapingProjectFolder>\bin\Debug\chromeDriver.exe
。- 我认为这就是
ChromeDriver
Nuget包所做的事情;我肯定没有自己配置它。 - 表面上感觉这是该ChromeDriver包作为“安装此软件包以使
new ChromeDriver()
正常工作”的尝试而做的合理事情。
- 我认为这就是
- 深入研究WebDriver代码库,发现它正在查看的“currentDirectory”是“
WebDriver.dll
的位置”。- 在我的情况下,那是“
<globalNugetPackagesCache>\selenium.webdriver\3.141.0\lib\netstandard2.0
” - 看起来我不应该试图让
chromedriver.exe
最终出现在这个文件夹中 - 将其复制到不同软件包的全局缓存中似乎是错误的?(大家同意吗?)
- 在我的情况下,那是“
这篇文章似乎得出了基本相同的结论,并说解决方案是以以下方式调用驱动程序:
new ChromeDriver(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location))
- 不幸的是,这条路径将带我到
<solutionFolder>\<APIProjectFolder>\bin\Debug\<ScrapingProjectFolder>.dll
,因为dll被复制到API项目的文件夹中。
- 不幸的是,这条路径将带我到
我想到了几个解决方案,但都不是很理想:
- 我可以将
Selenium.WebDriver.ChromeDriver
安装到API项目中。- 哎呀... API项目不知道WebDriver或Selenium,现在Scraping项目没有驱动程序exe文件了。
- 我可以手动将exe文件复制到正确的位置。
- 感觉不太对劲,而且很脆弱。我怀疑这会使部署变得痛苦。
- 我可以手动将ChromeDriver构造函数指向硬编码路径,我碰巧知道该路径包含当前的
exe
。- 看起来与上面类似,但不太糟糕。
- ??? 有没有一种方法可以使项目的所有DLL等被编译到单个公共文件夹中? ???
有没有一个好的、非hacky的方法来解决这个问题。这将导致一个只需运行的git仓库,并且将来部署到服务器上也相对容易?
我描述的任何事情都错了吗,或者配置错误吗?