Linux(CentOS)搭建Selenium + PHP-WebDriver:从环境配置到自动化实践
背景:为什么需要在Linux上搭建Selenium?
在Web开发与自动化测试中,我们常常需要模拟真实用户行为来执行重复性任务,例如:
自动化测试:对Web应用进行功能回归测试,确保代码变更不会破坏现有功能。
数据采集:从动态加载内容的网站(如使用JavaScript渲染的页面)抓取结构化的数据。
日常运维:自动执行网站登录、表单提交、定时任务等需要浏览器环境支撑的操作。
在Linux(特别是CentOS)服务器环境下,由于缺乏图形界面,无法直接运行带有可视化窗口的浏览器。因此,我们需要借助 Selenium 这个强大的浏览器自动化框架,并配合 无头模式(Headless) 的Chrome浏览器,在无图形界面的服务器上驱动浏览器执行任务。
同时,为了让PHP语言能够方便地控制Selenium,我们还需要安装 PHP-WebDriver 这个Composer包。它提供了面向对象的API,让PHP开发者可以像操作本地浏览器一样编写自动化脚本。
核心步骤:搭建与配置流程
本教程的核心目标是:在CentOS系统上,搭建起Java运行环境、Chrome浏览器、Selenium独立服务器、ChromeDriver驱动,并通过Composer安装PHP-WebDriver库,最终实现PHP脚本对浏览器的自动控制。
1. 安装基础环境
安装Java环境:Selenium Standalone Server是基于Java的,因此首先需要安装Java运行环境(JRE)。使用
yum -y install java-1.8.0-openjdk*命令即可完成安装。安装Chrome浏览器:通过官方提供的RPM包,使用
yum install命令可以直接安装Google Chrome稳定版。
# 安装Java环境 yum -y install java-1.8.0-openjdk*x86_64 # 安装Chrome yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
2. 下载与配置Selenium服务
下载Selenium Server:从Google Storage下载对应版本的
selenium-server-standalone.jar文件,并放置在约定目录(如/usr/local/selenium/)下。下载ChromeDriver:ChromeDriver是让Selenium控制Chrome浏览器的桥梁。特别需要注意,其版本必须与你安装的Chrome浏览器版本相匹配(或选择最接近的版本)。下载后解压至同一目录。
启动Selenium服务:通过
java -jar命令启动Selenium Server,并指定ChromeDriver的路径和监听端口(例如6666),使其作为一个后台服务等待PHP脚本的连接。
# 下载selenium(以3.9.1版本为例) mkdir /usr/local/selenium wget -c http://selenium-release.storage.googleapis.com/3.9/selenium-server-standalone-3.9.1.jar -O /usr/local/selenium/selenium-server-standalone.jar # 查看Chrome版本 /opt/google/chrome/chrome -version # 下载chromedriver(版本需与Chrome对应) wget -c https://chromedriver.storage.googleapis.com/107.0.5304.62/chromedriver_linux64.zip -O /usr/local/selenium/chromedriver_linux64.zip unzip /usr/local/selenium/chromedriver_linux64.zip -d /usr/local/selenium/ # 运行selenium服务 java -jar -Dwebdriver.chrome.driver="/usr/local/selenium/chromedriver" /usr/local/selenium/selenium-server-standalone.jar -port 6666
3. 安装PHP-WebDriver库
在你的PHP项目目录中,使用Composer引入官方的 php-webdriver/webdriver 包。这是PHP与Selenium Server通信的客户端库。
cd /home/webdriver/ composer require php-webdriver/webdriver
4. 编写并运行PHP测试脚本
配置无头模式:在脚本中,通过
ChromeOptions类添加--headless参数,这样浏览器就会在后台运行,不会弹出窗口,适合服务器环境。建立连接:使用
RemoteWebDriver::create()方法,连接到本机启动的Selenium服务(http://127.0.0.1:6666/wd/hub)。执行操作:脚本中演示了两种典型场景:
场景一:访问一个网站(
notevm.com),执行搜索关键词(“php”),并抓取搜索结果中的特定元素文本,保存到本地文件。场景二:模拟翻页,访问百度搜索“webdriver”的结果列表,并循环抓取两页的内容。
等待机制:脚本中使用了显式等待(
wait)和隐式等待(implicitlyWait),以确保页面元素加载完成后再进行操作,提高脚本的稳定性。
测试代码一:网站搜索与内容抓取
<?php namespace Facebook\WebDriver; use Facebook\WebDriver\Remote\DesiredCapabilities; use Facebook\WebDriver\Remote\RemoteWebDriver; use Facebook\WebDriver\Chrome\ChromeOptions; require_once('./vendor/autoload.php'); $options = new ChromeOptions(); $options->addArguments(array('--no-sandbox','--disable-dev-shm-usage')); $options->addArguments(array('--headless')); // 无头模式,不会弹出浏览器窗口,没有安装图形界面的一定要设置这个 // $options->setExperimentalOption('prefs', array('profile.managed_default_content_settings.images'=>2)); // 禁止加载图片 $capabilities = DesiredCapabilities::chrome(); $capabilities->setCapability(ChromeOptions::CAPABILITY, $options); $host = 'http://127.0.0.1:6666/wd/hub'; // selenium服务监听地址 $driver = RemoteWebDriver::create($host,$capabilities,5000); $size = new WebDriverDimension(1920,1080); // 窗口大小 $driver->manage()->window()->setSize($size); // 设置窗口大小 // $driver->manage()->window()->maximize(); // 浏览器窗口最大化 $driver->get('https://www.notevm.com/'); // 打开网页 /* $driver->wait(10,100)->until( // 等待class为navbar-search-icon的元素加载完成,最多等待10秒,每100毫秒重试一次 function () use ($driver){ return $driver->findElements(WebDriverBy::className('navbar-search-icon')); } ); */ $driver->manage()->timeouts()->implicitlyWait(10); // 等待所有元素加载完成,最多等待10秒 $driver->findElement(WebDriverBy::className('navbar-search-icon'))->click(); // 点击搜索按钮 $driver->findElement(WebDriverBy::className('navbar-search-input'))->click(); // 点击输入框 $driver->getKeyboard()->sendKeys('php'); // 输入php $driver->findElement(WebDriverBy::className('navbar-search-btn'))->click(); // 点击搜索按钮 /* $driver->getKeyboard()->pressKey(WebDriverKeys::ENTER); // 按下回车键 $driver->getKeyboard()->releaseKey(WebDriverKeys::ENTER); // 释放回车键 */ $driver->wait(10,100)->until( function () use ($driver){ return $driver->findElements(WebDriverBy::className('main')); // 等待class为main的元素加载完成 } ); $elements = $driver->findElements(WebdriverBy::cssSelector('div.item-excerpt>p')); if($elements){ foreach ($elements as $element){ file_put_contents('./sanqing.txt',$element->getText().PHP_EOL,FILE_APPEND); // 保存到文件 echo '>> ' . $element->getText().PHP_EOL; } } sleep(1); echo PHP_EOL; echo '结束了'.PHP_EOL; sleep(3); $driver->quit(); ?>
测试代码二:百度搜索翻页抓取
<?php namespace Facebook\WebDriver; use Facebook\WebDriver\Remote\DesiredCapabilities; use Facebook\WebDriver\Remote\RemoteWebDriver; use Facebook\WebDriver\Chrome\ChromeOptions; use Facebook\WebDriver\WebDriverBy; require_once('./vendor/autoload.php'); $options = new ChromeOptions(); $options->addArguments(array('--no-sandbox','--disable-dev-shm-usage')); $options->addArguments(array('--headless')); // 无头模式,不会弹出浏览器窗口,没有安装图形界面的一定要设置这个 $capabilities = DesiredCapabilities::chrome(); $capabilities->setCapability(ChromeOptions::CAPABILITY, $options); $host = 'http://127.0.0.1:6666/wd/hub'; // selenium服务监听地址 $driver = RemoteWebDriver::create($host,$capabilities,5000); for ($i = 0;$i < 2; $i++){ $pn = $i * 10; $driver->get('https://www.baidu.com/s?wd=webdriver&pn=' . $pn); $elements = $driver->findElements(WebdriverBy::cssSelector('span.content-right_8Zs40')); if($elements){ foreach ($elements as $element){ echo '>> ' . $element->getText().PHP_EOL; } } sleep(1); } sleep(1); echo PHP_EOL; echo '结束了'.PHP_EOL; sleep(3); $driver->quit(); ?>
总结
通过本教程,我们完整地走通了在CentOS系统上搭建Selenium自动化环境的核心流程,并验证了PHP通过WebDriver控制浏览器的基本能力。整个过程可以概括为以下几个关键环节:
| 阶段 | 核心任务 | 关键点与工具 |
|---|---|---|
| 环境准备 | 安装Java、Chrome浏览器 | yum 包管理器 |
| 服务搭建 | 下载Selenium Server和ChromeDriver | 版本匹配、java -jar启动服务 |
| 库安装 | 在PHP项目中引入WebDriver | Composer包管理 |
| 脚本开发 | 编写PHP脚本,实现自动化操作 | 无头模式、等待机制、元素定位 |
这套环境为后续进行更复杂的自动化任务(如登录验证、批量数据提交、网页截图等)奠定了坚实的基础。在运行过程中,如果遇到连接超时或元素找不到的问题,建议优先检查Selenium服务的端口是否可访问,以及页面元素的定位策略是否准确。
请先 登录后发表评论 ~