browserkit组件

browserkit组件

Browserkit组件模拟了Web浏览器的行为,允许您制作请求,单击“链接”并以编程方式提交表单。

笔记

在4.欧宝娱乐app下载地址3之前的Symfony版本中,BrowsErkit组件只能对您的应用程序进行内部请求。从symfony 4.3开始欧宝娱乐app下载地址,这个组件也可以将HTTP请求提供给任何公共网站与它结合使用时httpclient组件

安装

1
$Composer需要Symfony欧宝娱乐app下载地址 / Browser-kit

笔记

如果在Symfony应用程序之外安装此组件,则必须要求欧宝娱乐app下载地址供应商/ autoload.php.代码中的文件以启用Composer提供的类自动加载机制。读本文更多细节。

基本用法

也可以看看

本文介绍如何在任何PHP应用程序中使用Browserkit功能作为独立组件。阅读欧宝娱乐app下载地址Symfony功能测试文章了解如何在Symfony应用程序中使用它。欧宝娱乐app下载地址

创建客户

该组件仅提供一个抽象客户端,并且不提供用于HTTP层的任何后端。要创建自己的客户端,您必须扩展AbstractBrowser.课程并实施dorequest()方法。此方法接受请求,并应返回响应:

命名空间acme.;欧宝娱乐app下载地址symfony \ component \ browserkit \ appressbrowser;欧宝娱乐app下载地址symfony \ component \ browserkit \ response;班级客户延伸AbstractBrowser.{保护功能Dorequest.$请求{// ...将请求转换为响应返回新的回复$内容$地位$标题);}}

为了简单地实现基于HTTP图层的浏览器,请看看欧宝娱乐app下载地址symfony \ component \ browserkit \ httpbrowser由...提供这个组成部分。基于的实现httpkernelinterface.,看看欧宝娱乐app下载地址symfony \ component \ httpkernel \ client由此提供httpkernel组件

发出请求

使用要求()制作HTTP请求的方法。前两个参数是HTTP方法和所请求的URL:

Acme \ Client.;$客户=新的客户();$履带=$客户- >要求'得到''/');

返回的价值要求()方法是一个实例欧宝娱乐app下载地址symfony \ component \ domcrawler \爬虫课程,由此提供domcrawler组件,允许以编程方式访问和遍历HTML元素。

XMLHTTPREQUEST()方法,定义与相同的参数要求()方法,是制作Ajax请求的快捷方式:

Acme \ Client.;$客户=新的客户();//自动添加了所需的http_x_requested_with标题$履带=$客户- >XMLHTTPREQUEST.'得到''/');

提交表格

AbstractBrowser.也能提交表格。首先,使用其任何按钮选择表单,然后在提交之前覆盖其任何属性(方法,字段值等):

Acme \ Client.;$客户=新的客户();$履带=$客户- >要求'得到''https://github.com/login');//查找“登录”按钮的表格并提交//'登录'可以是<按钮>或<输入类型=“提交”>的文本内容,id,值或名称>$客户- >提交表格'登录');//第二个可选参数允许您覆盖默认表单字段值$客户- >提交表格'登录'['登录'=>'my_user''密码'=>'my_pass'//上传文件,值必须是绝对文件路径'文件'=>__文件__]);//您也可以覆盖其他表单选项$客户- >提交表格'登录'['登录'=>'my_user''密码'=>'my_pass'],//覆盖默认表单http方法'放'//覆盖某些$ _server参数(例如http标头)['http_accept_language'=>'es']);

如果你需要欧宝娱乐app下载地址symfony \ component \ domcrawler \表单提供对表单属性的访问的对象(例如$ form-> geturi()$ form-> getValues()$ form-> getfields()),使用此其他方法:

// ......//选择表单并填写某些值$表格=$履带- >SelectButton.'登录'- >形式();$表格['登录']='欧宝娱乐app下载地址symfonyfan';$表格['密码']='Anypass';//提交表格$履带=$客户- >提交$表格);

自定义标题处理

5.2版中的新增功能:Getheaders()在Symfony 5.2中引入了方法。欧宝娱乐app下载地址

可选的HTTP标题传递给要求()方法遵循FastCGI请求格式(大写,下划线而不是破折号并以前缀为前缀http_)。在将这些标题保存到请求之前,它们是低套管的http_剥离,下划线转向破折号。

如果您正在向具有关于标题大写或标点符号的特殊规则的应用程序提出请求,请覆盖Getheaders()方法,必须返回关联标题数组:

保护功能Getheaders.要求$请求大批{$标题=父母::Getheaders.$请求);如果发行$请求- >Geterver()['api_key'])){$标题['api_key']=$请求- >Geterver()['api_key'];}返回$标题;}

饼干

检索cookie

AbstractBrowser.实施通过a暴露饼干(如果有的话)欧宝娱乐app下载地址symfony \ component \ browserkit \ cookiejar,它允许您在与客户端进行请求时存储和检索任何cookie:

Acme \ Client.;// 发出请求$客户=新的客户();$履带=$客户- >要求'得到''/');//得到cookie jar$ cookiejar.=$客户- >getcookiejar.();//按名称获取cookie$ cookie.=$ cookiejar.- >得到'name_of_the_cookie');//获取cookie数据$名称=$ cookie.- >getName.();价值=$ cookie.- >GetValue.();$ RAPVALUE.=$ cookie.- >Getrawvalue.();$发布=$ cookie.- >发布();$ Ishttponly=$ cookie.- >Ishttponly();$ Isexpired.=$ cookie.- >itexext();$到期=$ cookie.- >Getexpirestime.();$途径=$ cookie.- >getpath.();$域名=$ cookie.- >getdomain.();$ samesite.=$ cookie.- >getsameite.();

笔记

这些方法仅返回尚未过期的cookie。

循环通过饼干

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 21 22 23 24 25 22
Acme \ Client.;// 发出请求$客户=新的客户();$履带=$客户- >要求'得到''/');//得到cookie jar$ cookiejar.=$客户- >getcookiejar.();//获取包含所有cookie的数组$ cookies.=$ cookiejar.- >全部();Foreach.$ cookies.作为$ cookie.{// ......}//获取所有值$价值=$ cookiejar.- >allvalues.'http://欧宝娱乐app下载地址www.oldmanjams.com');Foreach.$价值作为价值{// ......}//获得所有原始值$ RAPVALUES.=$ cookiejar.- >allrawvalues.'http://欧宝娱乐app下载地址www.oldmanjams.com');Foreach.$ RAPVALUES.作为$ RAPVALUE.{// ......}

设置cookie

您还可以创建cookie并将其添加到可以注入客户端构造函数的cookie jar:

Acme \ Client.;//创建cookie并添加到cookie jar$ cookie.=新的曲奇饼'味道''巧克力'斯特洛蒂时期'+1天'));$ cookiejar.=新的饼干罐();$ cookiejar.- >$ cookie.);//创建客户端并设置cookie$客户=新的客户([],空值$ cookiejar.);// ......

历史

客户端存储所有请求,允许您在历史记录中返回和转发:

Acme \ Client.;$客户=新的客户();$客户- >要求'得到''/');//选择并单击链接$链接=$履带- >选择Link.'欧宝体育电话文件'- >关联();$客户- >点击$链接);//返回主页$履带=$客户- >背部();//前进到文档页面欧宝体育电话$履带=$客户- >向前();

您可以使用该客户删除客户端的历史记录重新开始()方法。这也将删除所有cookie:

Acme \ Client.;$客户=新的客户();$客户- >要求'得到''/');//重置客户端(历史记录和cookie也被清除)$客户- >重新开始();

制作外部HTTP请求

到目前为止,本文中的所有示例都假定您正在向您的应用程序提出内部请求。但是,在将HTTP请求与外部网站和应用程序进行HTTP请求时,可以运行完全相同的示例。

首先,安装和配置httpclient组件。然后,使用欧宝娱乐app下载地址symfony \ component \ browserkit \ httpbrowser要创建将制作外部HTTP请求的客户端:

欧宝娱乐app下载地址symfony \ component \ browserkit \ httpbrowser;欧宝娱乐app下载地址symfony \ component \ httpclient \ httpclient;$浏览器=新的httpbrowser.httpclient::创造());

您现在可以使用本文中显示的任何方法来提取信息,单击链接,提交表单等。这意味着您不再需要使用专用的Web爬网或刮刀等Goutte.

$浏览器=新的httpbrowser.httpclient::创造());$浏览器- >要求'得到''https://github.com');$浏览器- >ClickLink.'登入');$浏览器- >提交表格'登入'['登录'=>'...''密码'=>'...']);$ OpenPullRequest.=修剪$浏览器- >ClickLink.'拉请求'- >筛选'.Table-list-header-toggle答:nth-​​child(1)'- >文本());

这项工作包括代码样本,是在a下获得的许可Creative Commons by-SA 3.0执照。