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