[PhpSelenium] 2.基本使用 PHP Selenium 发布于2020-01-17 / 更新于2021-01-02 07:04
仅用于交流和学习,禁止利用本资源从事任何违反本国(地区)法律法规的活动,一切遵守《网络安全法》 代码区黏贴出来的时候特殊符号会自动添加转义\,可能没有完全改好,如果运行有问题,请参考示例代码 )
示例流程 打开百度页面 搜索新浪微博 在新浪微博页面搜索周杰伦 输出周杰伦相关热门微博 实战步骤 1、 通过composer安装Selenium:
[ root@ar414.com Test] composer require facebook/webdriver
2、 启动Selenium Server
[ root@ar414.com Test] java -jar selenium-server-standalone-3.141.59.jar
3、示例代码 (https://github.com/ar414-com/phpseleniumdemo/tree/master/Test )
<?php
namespace Facebook\ WebDriver ;
use Facebook\ WebDriver\ Remote\ DesiredCapabilities ;
use Facebook\ WebDriver\ Remote\ RemoteWebDriver ;
require_once ( 'vendor/autoload.php' ) ;
header ( "Content-Type: text/html; charset=UTF-8" ) ;
$waitSeconds = 15 ; //需等待加载的时间,一般加载时间在0-15秒,如果超过15秒,报错。
$host = 'http://localhost:4444/wd/hub' ; // this is the default
$capabilities = DesiredCapabilities: : chrome ( ) ;
$driver = RemoteWebDriver: : create ( $host , $capabilities , 5000 ) ;
try
{
$driver - > get ( 'https://www.baidu.com/' ) ;
echo "当前页面标题:" . $driver - > getTitle ( ) . "\n" ;
//定位到输入框\->输入"新浪微博"->点击搜索
$driver - > findElement ( WebDriverBy: : id ( 'kw' ) ) - > sendKeys ( '新浪微博' ) - > submit ( ) ;
// 等待新的页面加载完成....
$driver - > wait ( $waitSeconds ) - > until ( WebDriverExpectedCondition: : visibilityOfElementLocated ( WebDriverBy: : partialLinkText ( '新浪微博' ) ) ) ;
//保存当前页面
savePageSource ( $driver , 1 ) ;
//一般点击链接的时候,担心因为失去焦点而抛异常,则可以先调用一下sendKeys,再click
$driver - > findElement ( WebDriverBy: : partialLinkText ( '新浪微博' ) ) - > sendKeys ( 'xxx' ) - > click ( ) ;
switchToEndWindow ( $driver ) ; //切换至最后一个window
$driver - > wait ( $waitSeconds ) - > until ( WebDriverExpectedCondition: : visibilityOfElementLocated ( WebDriverBy: : cssSelector ( 'h2.UG_box_title' ) ) ) ;
echo "当前页面标题:" . $driver - > getTitle ( ) . "\n" ;
//保存当前页面
savePageSource ( $driver , 2 ) ;
$driver - > findElement ( WebDriverBy: : cssSelector ( 'input.W_input' ) ) - > sendKeys ( '周杰伦' ) ;
$driver - > findElement ( WebDriverBy: : cssSelector ( 'a.W_ficon.ficon_search.S_ficon' ) ) - > sendKeys ( 'xxx' ) - > click ( ) ;
$driver - > wait ( $waitSeconds ) - > until (
WebDriverExpectedCondition: : visibilityOfElementLocated ( WebDriverBy: : cssSelector ( 'div.info' ) ) ) ;
echo "当前页面标题:" . $driver - > getTitle ( ) . "\n" ;
//保存当前页面
savePageSource ( $driver , 3 ) ;
//获取相关热门
//div.card-wrap
$elements = $driver - > findElements ( WebDriverBy: : cssSelector ( 'div.card-wrap' ) ) ;
foreach ( $elements as $index = > $element )
{
$userNickName = $element - > findElement ( WebDriverBy: : cssSelector ( 'a.name' ) ) - > getText ( ) ;
echo "用户名:$userNickName \n" ;
$content = $element - > findElement ( WebDriverBy: : cssSelector ( 'p.txt' ) ) - > getText ( ) ;
echo "内容:{ $content } \n" ;
echo "------------------------分割线\------------------------\n" ;
}
//关闭标签并退出浏览器
$driver - > close ( ) ;
$driver - > quit ( ) ;
}
catch ( \Throwable $throwable )
{
$driver - > close ( ) ;
$driver - > quit ( ) ;
var_dump ( $throwable - > getMessage ( ) ) ;
}
/**
* 保存页面
* @param $driver
* @param $pageNumber
*/
function savePageSource ( $driver , $pageNumber )
{
//获取页面资源
$pageSource = $driver - > getPageSource ( ) ; //输入到文件
file_put_contents ( "./ar414_page{ $pageNumber } .html" , $pageSource ) ;
}
/**
* 切换至最后一个window
* 因为有些网站的链接点击过去带有target="_blank"属性,
* 就新开了一个TAB,而selenium还是定位到老的TAB上,
* 如果要实时定位到新的TAB,则需要调用此方法,
* 切换到最后一个window
* @param $driver
*/
function switchToEndWindow ( $driver )
{
$arr = $driver - > getWindowHandles ( ) ;
foreach ( $arr as $k = > $v ) {
if ( $k == ( count ( $arr ) - 1 ) ) {
$driver - > switchTo ( ) - > window ( $v ) ;
}
}
}
4、 运行示例代码
[ root@ar414.com Test] ll -a
total 24
drwxr-xr-x 3 root root 90 Dec 15 21 :50 .
drwxr-xr-x 7 root root 4096 Dec 15 19 :53 ..
-rw-r--r-- 1 root root 64 Dec 15 19 :59 composer.json
-rw-r--r-- 1 root root 4925 Dec 15 19 :59 composer.lock
-rw-r--r-- 1 root root 28 Dec 15 21 :43 .gitignore
-rw-r--r-- 1 root root 3820 Dec 15 21 :42 Run.php
drwxr-xr-x 5 root root 69 Dec 15 20 :01 vendor
[ root@ar414.com Test] php Run.php
当前页面标题:百度一下,你就知道
当前页面标题:微博-随时随地发现新鲜事
当前页面标题:微博搜索
用户名:周杰伦资讯网官方微博
内容:周杰伦【我是如此相信】完整MV 大首播!
MV中周杰伦戴着鸭舌帽帅气入镜,回到刚出道第一张专辑的造型!在乐坛迈入20年的此刻,周杰伦也用MV影像作品带大家重回初心。
周杰伦新歌-我是如此相信 MV大首播!
周杰伦#fanstube#
L周杰伦资讯网官方微博的微博视频
------------------------分割线------------------------
用户名:全球热门搜罗
内容:周杰伦精选的慢歌30首:
《 說好不哭+等你下課+愛在西元前+安静+可愛女人+星晴+彩虹+斷了的弦+楓+告白氣球+擱淺+黑色毛衣+黑色幽默+東風破+髪如雪+算什麽男人+千里之外+青花瓷+晴天+大笨鐘+她的睫毛+愛情廢柴+我不配+心雨+夜的第七章+夜曲+一路向北+稻香》
视频较长,建 展开全文c
------------------------分割线------------------------
用户名:杰威尔音乐官方微博
内容:周杰伦「我是如此相信」电影天火主题曲
表达了在面对灾难时,不畏艰难、不放弃的信念!歌好听电影也要记得去看!
QQ音乐链接L我是如此相信 ( 《天火》电影主題曲)
------------------------分割线------------------------
用户名:爱川川
内容:周杰伦
所有人都在听的周杰伦新歌《我是如此相信》,该作品有方文山作词,周杰伦作曲和演唱,喜欢、支持周杰伦的歌曲 L爱川川的微博视频
------------------------分割线------------------------
用户名:多年以前多年前
内容:嗯啦喜欢周杰伦 2 武汉 L多年以前多年前的微博视频
------------------------分割线------------------------
用户名:南国都市报
内容:#听歌# 周杰伦《我是如此相信》1080P官方完整版MV,一起来听周董的新歌吧~L周杰倫微博台的微博视频
------------------------分割线------------------------
用户名:浮生南
内容:电影《天火》主题曲——周杰伦新歌「我是如此相信」
表达了在面对灾难时,不畏艰难、不放弃的信念!好好听 L浮生南的微博视频
------------------------分割线------------------------
用户名:江珊Harley
内容:【周杰伦我是如此相信】,我投给了“#我是如此相信 好听#”这个选项,你也快来表态吧~
------------------------分割线------------------------
用户名:jeunao
内容:#周杰伦海口演唱会##周杰伦深圳演唱会#
周杰伦 地表最强巡回演唱会 门票
海口
500 /700/900/1300/1700/2000
有ð«,前徘少量,要俬 #周杰伦演唱会# i
------------------------分割线------------------------
用户名:我源哥才是大总攻
内容:#宋亚轩 一个人的阿卡贝拉# #宋亚轩翻唱周杰伦晴天# 喜欢上这么个优秀小孩也太幸福了
------------------------分割线------------------------
用户名:就爱傲娇的周小只
内容:我艹!老子都不晓得是该笑还是该哭了。。。果然jvr的员工只有周杰伦一个人
------------------------分割线------------------------
用户名:婷strawberryfve
内容:#周杰伦新歌我是如此相信#不得不承认,我小时候的眼光真的很好
------------------------分割线------------------------
用户名:娱乐圈有饭
内容:吴谨言一天喝两三杯奶茶??周杰伦都不敢说自己一天两三杯奶茶吧
------------------------分割线------------------------
用户名:整理师睿姿
内容:#周杰伦新歌我是如此相信# 周董又出新歌了,赶紧听听。Apple Music:《我是如此相信》 (电影《天火》主题曲) 天王嫂是这个电影的女主角。so 周董也是为了捧媳妇儿。话说 昆凌的演技还需要再历练历练。周董在mv中 好像瘦了哦
------------------------分割线------------------------
用户名:He_說
内容:周杰伦 ×#周杰伦新歌我是如此相信#
戴着鸭舌帽的酷酷男孩
二十年始终如一
#我是如此相信##世无其二周杰伦#
------------------------分割线------------------------
用户名:一朵小枇杷
内容:我参与了@荣耀的背后刻着一道孤独0118 发起的【周杰伦我是如此相信】,我投给了“#周杰伦新歌我是如此相信#”这个选项,你也快来表态吧~
------------------------分割线------------------------
用户名:搞笑巍
内容:《昆凌如果真的要当演员,首先还是要摆脱周杰伦的影子》 O昆凌如果真的要当演员,首先还是要摆脱周杰伦的影子
------------------------分割线------------------------
用户名:首发微音乐
内容:#周杰伦新歌我是如此相信# 周杰伦《我是如此相信》官方版MV首发,熟悉的抒情摇滚曲风,那个鸭舌帽男孩回来了 L首发微音乐的微博视频
------------------------分割线------------------------
用户名:周杰倫微博台
内容:【#周杰伦新歌我是如此相信#】
有一种天气叫《晴天》
有一种香气叫《稻香》
有一种晚安叫《夜曲》
有一种停滞叫《搁浅》
有一种美丽叫《彩虹》
有一种海洋叫《花海》
有一种静谧叫《安静》
有一种夜空叫《星晴》
有一种让步叫《退后》
有一种劝诫叫《不该》
有一种国宝叫《青花瓷》
有一种香味叫《七里 展开全文c
------------------------分割线------------------------
用户名:会星座的兔子
内容:#周杰伦新歌我是如此相信#你觉得周杰伦新歌如何? 你觉得周杰伦新歌如何?
------------------------分割线------------------------
用户名:酒酿馒头鱼
内容:#宋亚轩翻唱周杰伦晴天# #宋亚轩 一个人的阿卡贝拉#
没签到的速来签到了,这个数据一点都不可啊对不对
没签到的小喷漆要被打屁股哦ð¤«
首页来接力?
------------------------分割线------------------------
用户名:诸葛亮郭嘉
内容:#周杰伦# #周杰伦新歌# #周杰伦新歌MV# #周杰伦我如此相信mv# 周杰伦新歌MV终于上线了《我是如此相信》是由方文山作词 周杰伦作曲并演唱的一首歌曲。我是如此相信 在背后支撑是你 一直与我并肩同行
------------------------分割线------------------------
用户名:你若撒野我把酒奉陪0118
内容:太惨了,所以新歌没嵌入到电影里,是不是就是因为只有周杰伦和录歌等人工作,所以都忙完没时间嵌入了ððð
------------------------分割线------------------------
用户名:HannahQuinli.. .
string( 291 ) "no such element: Unable to locate element: {" method":" css selector"," selector":" p.txt"}
( Session info: chrome = 78.0 .3904.108)
( Driver info: chromedriver = 78.0 .3904.105 ( 60e2d8774a8151efa6a00b1f358371b1e0e07ee2-refs/branch-heads/3904@{ #877} ) ,platform= Linux 3.10 .0-862.9.1.el7.x86_64 x86_64
讨论