在使用php-webdriver调用chrome浏览器打开网页时,如果每次都从零开始打开浏览器,那打开速度会非常慢,如果每次打开浏览器后,第二次访问其他网页时,直接调用已经打开的浏览器,这样是可以迅速提升访问速度,这里我们可以通过方法RemoteWebDriver::createBySessionID实现
php-webdriver的安装和基本使用,可以参考这2篇文章:
《Php使用php-webdriver库调用Chrome浏览器无头模式的2种方法》
《php关闭终端也可以使用Chromedriver或者Selenium方法》
下面给出具体代码,处理思路就是创建一个文件来实时保存和读取SessionID和Capabilities;如果过期了就直接通过RemoteWebDriver::create建立一个新的;这里需要注意,最新版php-webdriver里的RemoteWebDriver::createBySessionID方法,要传递Capabilities参数的话,是在第6个参数位置,而且需要与create里的方法一致,中间无需传递的参数用null代替即可,如果参数位置不正确,则会提示”Existing Capabilities were not provided, and they also cannot be read from Selenium Grid”错误:
<?php require_once 'vendor/autoload.php'; use Facebook\WebDriver\Chrome\ChromeOptions; use Facebook\WebDriver\Remote\DesiredCapabilities; use Facebook\WebDriver\Remote\RemoteWebDriver; use Facebook\WebDriver\WebDriverBy; use Facebook\WebDriver; use Facebook\WebDriver\Remote; $driver = createDriver(); function createDriver($isnew = false){ // 创建 WebDriver 实例 $host = 'http://localhost:4444/wd/hub'; //$host = 'http://localhost:4444'; // 如果使用 Selenium Grid,则需要更改主机和端口 // 后续脚本中复用会话,读取时反序列化 $data = json_decode(file_get_contents('session.json'), true); if(!empty($data) && $isnew == false){ $capabilities = (object)unserialize($data['capabilities']); $sessionID = $data['sessionid']; $driver = RemoteWebDriver::createBySessionID($sessionID, $host,null,null,null,$capabilities); try { $driver->getCurrentURL(); // 触发浏览器交互,检测$driver是否还有效 } catch (Exception $e) { // 关闭浏览器 $driver->quit(); $driver = createDriver(true);//如果过期,重新生成一个新的 } }else{ // 设置 ChromeOptions 以启用无头模式 $options = (new ChromeOptions())->addArguments([ 'headless', // 启用无头模式 'disable-gpu', // 适用于 Linux,禁用 GPU 加速以避免问题 'no-sandbox' // 在 Docker 等环境中可能需要禁用沙箱 //若使用自签名证书或测试环境证书,浏览器可能因证书不受信任而阻塞加载 //加上下面2行可以强制忽略证书错误 '--ignore-certificate-errors', // 忽略证书错误 '--allow-insecure-localhost' // 允许本地不安全证书 ]); // 设置 DesiredCapabilities $capabilities = DesiredCapabilities::chrome(); $capabilities->setCapability(ChromeOptions::CAPABILITY, $options); $driver = RemoteWebDriver::create($host, $capabilities); // 首次启动时保存会话ID,存储时序列化配置 $sessionData = [ 'sessionid' => $driver->getSessionID(), 'capabilities' => serialize($driver->getCapabilities()) ]; file_put_contents('session.json', json_encode($sessionData)); } return $driver; } try { // 其他代码写这里,比如打开一个网页 $driver->get('https://www.baidu.com'); print_r($driver->getPageSource()); }catch (Exception $e) { echo $e->getMessage(); }finally { }