php-webdriver RemoteWebDriver::createBySessionID 示例

在使用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 {

}

 

 

相关推荐