我正在尝试使用Selenium和.NET Core来构建一个网络抓取应用程序,但是我很难找到我的WebDriver exe

我有一个.csproj,它将为该项目运行API,并(除其他外)调用另一个将处理网络抓取的.csproj。
全部都在单个.sln中,并且都在运行.NET Core 2.1

在抓取项目中,我已经nuget安装了Selenium.WebDriverSelenium.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包中的所有dllexe都存储在Global Nuget高速缓存中,而不是存储在解决方案目录中的nuget packages文件夹中。
  • 这似乎是预期的行为:"Bug" raised in dotnet Std; MSDN migration docs
  • 似乎将chromedriver.exe复制到<solutionFolder>\<ScrapingProjectFolder>\bin\Debug\chromeDriver.exe
  • 我假设这就是ChromeDriver Nuget包所做的;当然,我自己还没有配置它。
  • 从表面上看,对于ChromeDriver程序包来说,尝试“安装该程序以使new ChromeDriver() JustWork成为一件合理的事情”。
  • 深入研究WebDriver代码库,发现它正在查看的“currentDirectory”是“WebDriver.dll的位置”。
  • 在我的情况下,这就是“<globalNugetPackagesCache>\selenium.webdriver\3.141.0\lib\netstandard2.0
  • 似乎我不应该尝试使chromedriver.exe最终出现在此文件夹中-将其复制到其他程序包的全局高速缓存中似乎是错误的吗? (人们同意吗?)
  • This article似乎已经得出了大致相同的结论,并说解决方案是通过以下方式调用驱动程序:
    new ChromeDriver(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location))
  • 不幸的是,该路径将我带到<solutionFolder>\<APIProjectFolder>\bin\Debug\<ScrapingProjectFolder>.dll,因为dll被复制到API项目的文件夹中。


  • 我想到了几种解决方案,但没有一种真正吸引人:
  • 我可以将Selenium.WebDriver.ChromeDriver安装到API项目中。
  • Eww ... API项目不了解WebDriver或Selenium,现在Scraping项目没有驱动程序exe。
  • 我可以手动将exe明确复制到正确的位置。
  • 感觉不太好,很脆弱。我怀疑这会给部署带来麻烦。
  • 我可以手动将ChromeDriver构造函数指向一个硬编码的路径,我刚好知道它包含当前的exe
  • 似乎与上面类似;虽然还不算太糟
  • ???是否有某种方法可以使项目的所有DLL等被编译到单个公用文件夹中? ???


  • 是否有解决该问题的好方法,且不会引起黑客的注意。哪个会导致JustWorks生成一个git repo,并且将来将其部署到服务器上将相对容易些?

    我上面描述的任何事情是否错误或配置错误?

    最佳答案

    如果我错了,请纠正我。您有某种引用了Selenium的类库,并且您想使用ChromeDriver.exe,但是会收到一个错误消息,即在以下位置找不到该错误。这很简单。
    当前,您正在引用类库,可以说Foo到API。您的程序集位置将指向API容器位置,而chromedriver.exe位于类库容器下。
    如果是这种情况,您唯一要做的就是将chromedriver.exe之后复制到最终的bin目录(即API)。

    将以下构建后事件添加到您的API项目中,以复制chromedriver:

      <Target Name="PostBuild" AfterTargets="PostBuildEvent">
        <Exec Command="copy $(SolutionDir)\ClassLibrary\bin\Debug\netstandard2.0\chromedriver.exe $(TargetDir)" />
      </Target>
    

    这会将您的chromedriver.exe复制到API bin。稍后在初始化ChromeDriver使用时:
            var options = new ChromeOptions();
            var service = ChromeDriverService.CreateDefaultService(AppDomain.CurrentDomain.BaseDirectory);
    
            WebDriver = new ChromeDriver(service, options);
    

    AppDomain.CurrentDomain.BaseDirectory将指向您的API bin目录。

    关于c# - 在带有.NET Core的库csproj中使用Selenium WebDriver,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54282110/

    10-14 04:30