Selenium + php-webdriverで両方のバージョンを上げたら、
PHP Fatal error: Uncaught Facebook\WebDriver\Exception\Internal\WebDriverCurlException: Curl error thrown for http POST to /session with params: {"capabilities":{"firstMatch":[{"browserName":"chrome","platformName":"linux","goog:chromeOptions":{"binary":"/usr/bin/google-chrome","args":["--headless","--disable-gpu","--no-sandbox"]}}]},"desiredCapabilities":{"browserName":"chrome","platform":"Linux","goog:chromeOptions":{"binary":"/usr/bin/google-chrome","args":["--headless","--disable-gpu","--no-sandbox"]}}} Operation timed out after 180000 milliseconds with 0 bytes received in <http://example.com/job/soycmstest/ws/vendor/php-webdriver/webdriver/lib/Exception/Internal/WebDriverCurlException.php>:20 Stack trace: /** 以下省略 **/
のエラーに陥ってしまった。
このエラーを解決した時にしたことをメモとして残しておく。
はじめに環境を記載しておく
・Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-84-generic x86_64)
・Selenium 4.13.0 (Seleniumの3系からアップグレード)
・php-webdriver 1.15.0 (1.12系からアップグレード)
・PHP 8.2.10
・Apache 2.4.57
テストコードの背景は、ログインを要するWebアプリで、何度もログインとログアウトを繰り返す。
同じような処理が続くので、
<?php class WebDriverUtil { private $driver; function init(){ $host = "http://example.com:4444/wd/hub"; $caps = DesiredCapabilities::chrome(); $opts = new ChromeOptions(); $opts->setBinary("/usr/bin/google-chrome"); $opts->addArguments(["--headless","--disable-gpu", "--no-sandbox"]); $caps->setCapability(ChromeOptions::CAPABILITY, $opts); $caps->setCapability("applicationCacheEnabled", false); $caps->setPlatform("Linux"); $this->driver = RemoteWebDriver::create($host, $caps); } function login(){ self::init(); $this->driver->get("http://example.com/login"); //ログインに関する処理 } function logout(){ //ログアウトに関する処理 $this->driver->close(); } }
のようなクラスを用意し、loginとlogoutを繰り返す。
Seleniumのアップグレード前はログインを何度も行うことができたが、アップグレード後は大体三回目のログインで冒頭のエラーになる。
Stack traceには
Facebook\WebDriver\Remote\RemoteWebDriver::create()
の時にエラーになることがわかったので、login内のinitの実行を初回のみにしてみたところ、
PHP Fatal error: Uncaught Facebook\WebDriver\Exception\InvalidSessionIdException: invalid session id in <http://example.com/job/soycmstest/ws/vendor/php-webdriver/webdriver/lib/Exception/WebDriverException.php>:110
のエラーに変わってしまった。
どうやら、ログイン毎にセッションを破棄して、再生成する必要があるようだ。
セッションに有効であるか?わからないけれども、php-webdriverが用意しているquitメソッドを用いると良いらしいので、
<?php class WebDriverUtil { private $driver; function init(){ if($this->driver instanceof Facebook\WebDriver\Remote\RemoteWebDriver){ $this->driver->quit(); } $host = "http://example.com:4444/wd/hub"; $caps = DesiredCapabilities::chrome(); $opts = new ChromeOptions(); $opts->setBinary("/usr/bin/google-chrome"); $opts->addArguments(["--headless","--disable-gpu", "--no-sandbox"]); $caps->setCapability(ChromeOptions::CAPABILITY, $opts); $caps->setCapability("applicationCacheEnabled", false); $caps->setPlatform("Linux"); $this->driver = RemoteWebDriver::create($host, $caps); } function login(){ self::init(); $this->driver->get("http://example.com/login"); //ログインに関する処理 } function logout(){ //ログアウトに関する処理 $this->driver->close(); } }
RemoteWebDriver::create($host, $caps)の前にdriverをquitしてみたら、冒頭のエラーは発生しなくなった。