使用Laravel / Dusk在无头镀铬中下载文件

时间:2018-05-18 06:50:17

标签: laravel google-chrome-headless laravel-dusk

我尝试使用Laravel / Dusk在无头镀铬中自动执行文件下载。在GUI模式下,文件在我的下载文件夹中下载得很好。但是在无头模式下,根本不会发生下载。有什么方法可以解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

对于那些遇到过这种情况的人,在撰写本文时,我发现了当前版本的Laravel的简单解决方案。

我建议先在您的存储路径中创建一个名为temp的目录(可能也要对此进行忽略),然后在Dusk安装中导航到DuskTestCase.php文件设置。

driver方法下,在初始化ChromeOptions变量的部分下添加以下内容。

$options->setExperimentalOption('prefs', [
    'download.default_directory' => storage_path('temp')
]);

driver函数现在应如下所示:

$options = (new ChromeOptions())->addArguments([
    '--disable-gpu',
    '--headless',
    '--window-size=1920,1080'
]);

$options->setExperimentalOption('prefs', [
    'download.default_directory' => storage_path('temp')
]);

return RemoteWebDriver::create(
    'http://localhost:9515',
    DesiredCapabilities::chrome()->setCapability(
        ChromeOptions::CAPABILITY,
        $options
    )
);

作为一个旁注,这对我通过JS创建的PDF文件有效,因此我不能确定地说这与从后端下载的文件如何工作。

答案 1 :(得分:0)

public function testDownload($account){
    $this->browse(function (Browser $browser) {
        $download_path = storage_path('your/download/path');
        $url = $browser->driver->getCommandExecutor()->getAddressOfRemoteServer();
        $uri = '/session/' . $browser->driver->getSessionID() . '/chromium/send_command';
        $body = [
            'cmd' => 'Page.setDownloadBehavior',
            'params' => ['behavior' => 'allow', 'downloadPath' => $download_path]
        ];
        (new \GuzzleHttp\Client())->post($url . $uri, ['body' => json_encode($body)]);

        // Start your test
        $browser->visit("http://example.com/export")
        //your asserts here
}

答案 2 :(得分:0)

不必触发单独的Guzzle POST,我改为使用CustomWebDriverCommand

$command = new \Facebook\WebDriver\Remote\CustomWebDriverCommand(
    $driver->getSessionID(),
    "/session/:sessionId/chromium/send_command",
    "POST",
    [
        "cmd" => "Page.setDownloadBehavior",
        "params" => ["behavior" => "allow", "downloadPath" => '/your/download/path']
    ]
);
$driver->getCommandExecutor()->execute($command);