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

5505阅读
0评论
0点赞

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

安装前准备

安装java环境

已有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-webdrivercomposer安装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 文件,写入以下代码。  
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代码。

评论(0)
暂无评论