excepción de facebook/php-webdriver Error al leer el puerto de marionetas (Firefox 109.0.1 – GeckoDriver 0.32 Debian-10)

2 minutos de lectura

Estoy tratando de usar php-webdriver con Laravel 8 en una instancia de AWS LigthSail que viene con Debian 10 instalado. Estoy usando Firefox (109.0.1) y Geckodriver (0.32). El código que debe ejecutarse representará un Trabajo que se programará para ejecutarse diariamente, para extraer cierta información de un sitio público. Para fines de prueba, he puesto el código en un controlador que se ejecuta en función de una determinada ruta.

$desiredCapabilities = DesiredCapabilities::firefox();
$desiredCapabilities->setCapability('acceptSslCerts', false);
$firefoxOptions = new FirefoxOptions();
$firefoxOptions->addArguments(['-headless']);
$firefoxOptions->setOption("binary", "/usr/bin/firefox"); 
$desiredCapabilities->setCapability(FirefoxOptions::CAPABILITY, $firefoxOptions);
$serverUrl="http://localhost:4444";
//$driver = RemoteWebDriver::create($serverUrl, $desiredCapabilities);
$driver = Firefox\FirefoxDriver::start($desiredCapabilities);
$driver->get('https://example.com');

Una vez recopilada la información, el código los enviará por correo electrónico a una determinada dirección de correo electrónico. Creo que el código está bien, ya que mi entorno de desarrollo local hace el trabajo que se supone que debe hacer. Sin embargo, cuando lo coloqué en el servidor, falla en esta línea. $driver = Firefox\FirefoxDriver::start($desiredCapabilities); planteando la siguiente excepción: Facebook\WebDriver\Exception\TimeoutException: Failed to read marionette port

Lo curioso es que si estoy iniciando firefox y geckodriver manualmente en el servidor y uso $driver = RemoteWebDriver::create($serverUrl, $desiredCapabilities); funciona bien Pero esto significa que firefox y geckodriver deben ejecutarse permanentemente incluso si cierro mi sesión ssh. He hecho que firefox se ejecute de forma permanente (con bg y renegar de comandos), pero geckodriver deja de ejecutarse cuando cierro la terminal.

De todos modos, deseo que WebDriver pueda iniciar geckodriver y firefox, y no mantenerlos vivos permanentemente. He intentado instalar Firefox con apt install o desde el repositorio oficial de mozilla o descargando y extrayendo FirefoxSetup.tar.bz pero el error sigue presente.

Parece que de alguna manera Geckodriver no sabe en qué puerto se está ejecutando Marionette. Lo que no entiendo es por qué cuando inicio manualmente firefox y gecko no hay problema, pero cuando webdriver los inicia de repente, geckodriver no puede conectarse a marionette.

Parece que el problema puede estar relacionado con este error. https://bugzilla.mozilla.org/show_bug.cgi?id=1421766. Pero de acuerdo con ese hilo, el error se solucionó hace 1 año al hacer que geckodriver leyera el puerto de Marionette desde el archivo MarionetteActivePort dentro del directorio de perfil de Firefox.

Sin embargo, en el directorio .mozilla/firefox no existe tal archivo MarionetteActivePort. Hay algunos directorios relacionados con un determinado perfil (uno predeterminado que está lleno de archivos y directorios) y uno que tiene solo un archivo, respectivamente, times.json. No sé exactamente cómo pasar dichos perfiles al webdriver y tampoco si esto resolverá el problema.

¿Alguien puede arrojar algo de luz sobre cómo se supone que debo decirle a GeckoDriver en qué puerto se está ejecutando Marionette?

¿Ha sido útil esta solución?