Linux(CentOS、Ubuntu)搭建selenium+php-webdriver web自动化测试环境详细教程

因为前段时间采集的一个目标站突然做了防采集(通过js加载内容,js代码加密了),我又不懂解密js,就想着通过php模拟浏览器渲染js加载内容,查了下资料才发现有这么个玩意可以控制浏览器(chrome、firefox等,我使用的是chrome),完全满足了我的需求。不过网上查的资料都比较乱,这里就做了个整合,也当做为自己做个记录文档,方便以后查阅。

安装前准备

安装java环境

CentOS:

yum -y install java-1.8.0-openjdk*x86_64

Ubuntu:

方法1:

apt -y install openjdk-8-jre-headless

方法2:

add-apt-repository ppa:openjdk-r/ppa
apt update
apt -y install openjdk-8-jdk

安装php

php安装方法就不说了,网上很多,也可以使用宝塔、护卫神、lnmp.org之类的一键安装包。

安装composer

composer安装教程我在另一个篇文章有写到,不会安装的可以到这里看:Linux安装composer教程

安装用到的软件包

CentOS:

yum -y install wget unzip

Ubuntu:

apt -y install wget unzip

开始安装

安装chrome

CentOS:

方法1:

在线安装

yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm

方法2:

先下载安装包再安装

wget -c https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
yum -y install ./google-chrome-stable_current_x86_64.rpm

Ubuntu:

apt -y install libxss1 libappindicator1 libindicator7
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
dpkg -i ./google-chrome-stable_current_amd64.deb
apt -f -y install

下载selenium

地址:http://selenium-release.storage.googleapis.com/index.html

我下载的3.9.1版本,下载到 /usr/local/selenium/ 目录下

创建目录并下载

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

下载chromedriver

地址:https://chromedriver.storage.googleapis.com/index.html

chromedriver的版本要跟安装的chrome的版本相对应,如果没有一样的版本就选择版本号最接近的。

查看chrome版本:

/opt/google/chrome/chrome -version

我的chrome版本:102.0.5005.61

Linux命令行查看chrome版本
查看chrome版本

chromedriver同样下载解压到/usr/local/selenium/目录下

wget -c https://chromedriver.storage.googleapis.com/102.0.5005.61/chromedriver_linux64.zip -O /usr/local/selenium/chromedriver_linux64.zip
unzip /usr/local/selenium/chromedriver_linux64.zip -d /usr/local/selenium/

使用composer安装php-webdriver

先进入项目目录再拉取,我的目录路径是/home/phpwebdriver/

cd /home/phpwebdriver/
composer require php-webdriver/webdriver
composer安装php-webdriver
composer安装php-webdriver

运行&测试

运行selenium服务

执行命令后将无法做其他操作,建议在screen里面运行或者用nohup命令

screen -S selenium
java -jar -Dwebdriver.chrome.driver="/usr/local/selenium/chromedriver" /usr/local/selenium/selenium-server-standalone.jar -port 6666
运行selenium
运行selenium

然后按ctrl+a+d可以退出screen环境。

测试

新建个notevm.php文件,写入以下代码。

<?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的元素加载完成
    }
);
$driver->takeScreenshot('./notevm.png');//截图,如果系统没有安装中文支持的话,中文会出现乱码
$driver->findElement(WebDriverBy::className('main'))->takeElementScreenshot('notevm-main.png');//截取某个元素的图片
$html = $driver->getPageSource();//获取html
$driver->quit();//退出浏览器
file_put_contents('./html.txt',$html);//保存HTML到文件
?>

执行

php notevm.php
测试php-webdriver抓取效果
测试抓取效果

可以看到成功截两张图片跟保存了html代码。

来看一下截图效果

php-webdriver截图整个页面
整个页面截图
php-webdriver截取某个元素图片
截取某个元素

最后请各位不要频繁拿我的博客测试,谢谢!

原创文章,作者:小哆啦,如若转载,请注明出处:https://www.notevm.com/a/5841.html

(0)
上一篇 2022年5月28日 10:10
下一篇 2022年5月29日 18:04

相关推荐