Я использую Dusk 5.1.
Моя цель - использовать Dusk для очистки внешних сайтов в процессе производства.Ничего лишнего, только несколько RSS-каналов и, возможно, темы на форуме.Мое приложение работает в моем собственном стеке docker-compose (не в Laradock или чем-либо еще) в production
.
Я не регистрирую DuskServiceProvider
и, следовательно, не подвержен риску в production
.
Вот проблема:
Facebook\WebDriver\Exception\WebDriverCurlException : Curl error thrown for http POST to /session with params: {"desiredCapabilities":{"browserName":"chrome","platform":"ANY","chromeOptions":{"w3c":false,"binary":"","args":["--disable-gpu","--headless","--no-sandbox","--verbose"]}}}
Failed to connect to localhost port 9515: Connection refused
Вот Browser.php
, который я использую, вместо того, который поставляется с Dusk для тестирования:
/**
* Reporting browser for console commands
*/
class Browser
{
/**
* @var \Laravel\Dusk\Browser
*/
private $browser;
public function browse(Closure $callback)
{
if (!$this->browser) {
$this->browser = $this->newBrowser($this->createWebDriver());
}
try {
$callback($this->browser);
} catch (Exception $e) {
throw $e;
} catch (Throwable $e) {
throw $e;
}
}
function __destruct()
{
if ($this->browser) {
$this->closeBrowser();
}
}
protected function closeBrowser()
{
if (!$this->browser) {
throw new Exception("The browser hasn't been initialized yet");
}
$this->browser->quit();
$this->browser = null;
}
protected function newBrowser($driver)
{
return new DuskBrowser($driver);
}
/**
* Create the remote web driver instance.
*
* @return \Facebook\WebDriver\Remote\RemoteWebDriver
*/
protected function createWebDriver()
{
return retry(5, function () {
return $this->driver();
}, 50);
}
protected function driver()
{
$options = new ChromeOptions();
$options->addArguments([
'--disable-gpu',
'--headless',
'--no-sandbox',
'--verbose',
]);
$capabilities = DesiredCapabilities::chrome();
$capabilities->setCapability(ChromeOptions::CAPABILITY, $options);
return RemoteWebDriver::create(
'http://localhost:9515', $capabilities
);
}
}
Затем в своем приложении я использую:
$defaultBrowser = app(Browser::class);
$defaultBrowser->browse(function (\Laravel\Dusk\Browser $browser) use ($feed) {
$pageSoure = $browser->visit($this->feedUrl())
->driver->getPageSource();
preg_match('/(<rss.+?<\/rss>)/is', $pageSoure, $matches);
$feed->fromContents($matches[0]);
});
В чем я не уверен, так это в том, какие шаги мне нужно предпринять, чтобы получить корректный запуск драйвера chrome в моем контейнере.
Примечание: в Интернете есть руководства по использованию Laravel Dusk с Docker, основанные на Selenium.Это приводит к проблемам с параллелизмом в моем приложении, поскольку они требуют запуска Selenium в качестве автономной службы, что приводит к проблемам сеанса, когда несколько заданий используют его одновременно.
My docker-compose Я не уверен, почему это было бы актуально, но некоторые люди просили об этом.
version: '3'
services:
web:
build:
context: .
dockerfile: infrastructure/web/Dockerfile
image: registry.gitlab.com/namespace/project:web
env_file: .env
volumes:
- ./:/var/www/html
- ./infrastructure/web:/etc/nginx/conf.d
links:
- redis
- db
ports:
- "80:80"
frontend-dev:
image: registry.gitlab.com/namespace/project:web
depends_on:
- web
volumes:
- ./:/var/www/html
command: sh -c "yarn install && yarn run dev"
queue:
build:
context: .
dockerfile: infrastructure/cli/Dockerfile
image: registry.gitlab.com/namespace/project:cli
env_file: .env
volumes:
- ./:/var/www/html
command: php /var/www/html/artisan horizon
links:
- redis
- db
redis:
image: redis:5.0-alpine
ngrok:
image: wernight/ngrok
env_file: .env
depends_on:
- web
ports:
- "4040:4040"
db:
image: mysql:8.0.3
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: xxxxxx
MYSQL_DATABASE: xxxxxx
MYSQL_USER: xxxxxx
MYSQL_PASSWORD: xxxxxx