BrowserKit组件

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.3,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

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 ()方法。这个方法接受一个请求并返回一个响应:

12 3 4 5 6 7 8 9 10 11 12 13 14
名称空间Acme使用欧宝娱乐app下载地址组件BrowserKitAbstractBrowser使用欧宝娱乐app下载地址组件BrowserKit响应客户端扩展AbstractBrowser受保护的函数doRequest请求/ /……将请求转换为响应返回响应(内容状态);}}

关于基于HTTP层的浏览器的简单实现,请参阅HttpBrowser所提供的这个组件.的实现HttpKernelInterface,看看HttpClientKernelHttpKernel组件

发出请求

使用请求()方法来发起HTTP请求。前两个参数是HTTP方法和请求的URL:

1 2 3 4
使用Acme客户端客户端客户端();履带客户端->请求(“得到”' / ');

方法返回的值请求()方法的实例履带类提供的DomCrawler组件,允许以编程方式访问和遍历HTML元素。

jsonRequest ()方法,该方法定义与请求()方法,是将请求参数转换为JSON字符串并设置所需的HTTP报头的快捷方式:

1 2 3 4 5
使用Acme客户端客户端客户端();//将参数编码为JSON并设置所需的CONTENT_TYPE和HTTP_ACCEPT报头履带客户端->jsonRequest (“得到”' / ', (“some_parameter”= >“some_value”]);

5.3

jsonRequest ()方法在Symfony 5.3中引入。欧宝娱乐app下载地址

xmlHttpRequest ()方法,该方法定义与请求()方法,是AJAX请求的快捷方式:

1 2 3 4 5
使用Acme客户端客户端客户端();//自动添加所需的HTTP_X_REQUESTED_WITH头履带客户端->xmlHttpRequest (“得到”' / ');

AbstractBrowser能够模拟链接单击。传递链接的文本内容,客户端将执行所需的HTTP GET请求来模拟链接点击:

1 2 3 4 5 6
使用Acme客户端客户端客户端();客户端->请求(“得到”' /产品/ 123);履带客户端->clickLink (“去别处……”);

如果你需要链接对象,该对象提供对链接属性的访问(例如。链接- > getMethod ()链接- > getUri ()),使用另一种方法:

1 2 3 4
/ /……履带客户端->请求(“得到”' /产品/ 123);链接履带->selectLink (“去别处……”->链接();客户端->点击(链接);

提交表单

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

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
使用Acme客户端客户端客户端();履带客户端->请求(“得到”“https://github.com/login”);//找到带有'Log in'按钮的表单并提交// 'Log in'可以是一个

如果你需要形式对象,该对象提供对表单属性的访问(例如。形式- > getUri ()形式- > getvalue ()形式- > getFields ()),使用另一种方法:

1 2 3 4 5 6 7 8 9
/ /……//选择表单并填写一些值形式履带->selectButton (“登录”->形式();形式“登录”] =“欧宝娱乐app下载地址symfonyfan”形式“密码”] =“anypass”//提交表单履带客户端->提交(形式);

自定义标头处理

5.2

getHeaders ()方法是在Symfony 5.2中引入的。欧宝娱乐app下载地址

的可选HTTP标头请求()方法遵循FastCGI请求格式(大写,下划线而不是破折号和前缀HTTP_).在将这些头保存到请求之前,它们是小写的,使用HTTP_将下划线转换为破折号。

如果向具有关于头字母大写或标点符号的特殊规则的应用程序发出请求,请重写getHeaders ()方法,该方法必须返回头部的关联数组:

1 2 3 4 5 6 7 8 9
受保护的函数getHeaders(请求请求数组::getHeaders (请求);如果收取请求->getServer () (“api_key”))) {“api_key”] =请求->getServer () (“api_key”];}返回;}

饼干

检索饼干

AbstractBrowser实现通过控件公开cookie(如果有)CookieJar,让你可以在向客户端发出请求时储存和检索任何cookie:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
使用Acme客户端//发送请求客户端客户端();履带客户端->请求(“得到”' / ');//获取饼干罐cookieJar客户端->getCookieJar ();//通过名称获取cookie饼干cookieJar->get (“name_of_the_cookie”);//获取cookie数据的名字饼干->getName ();价值饼干->getValue ();rawValue饼干->getRawValue ();isSecure饼干->isSecure ();isHttpOnly饼干->isHttpOnly ();isExpired饼干->isExpired ();到期饼干->getExpiresTime ();路径饼干->getPath ();饼干->getDomain ();sameSite饼干->getSameSite ();

请注意

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

循环浏览cookie

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
使用Acme客户端//发送请求客户端客户端();履带客户端->请求(“得到”' / ');//获取饼干罐cookieJar客户端->getCookieJar ();//获取包含所有cookie的数组饼干cookieJar->所有();foreach饼干作为饼干){/ /……//获取所有值cookieJar->allValues (“http://欧宝娱乐app下载地址www.oldmanjams.com”);foreach作为价值){/ /……//获取所有原始值rawValuescookieJar->allRawValues (“http://欧宝娱乐app下载地址www.oldmanjams.com”);foreachrawValues作为rawValue){/ /……

设置cookie

你也可以创建cookie,并将它们添加到一个cookie罐子中,然后注入到客户端构造函数中:

1 2 3 4 5 6 7 8 9 10
使用Acme客户端//创建cookie并添加到cookie jar饼干饼干(“味道”“巧克力”strtotime (“+ 1天”));cookieJarCookieJar ();cookieJar->集(饼干);//创建客户端并设置cookie客户端客户端([],cookieJar);/ /……

历史

客户端存储了你所有的请求,允许你在历史记录中来回切换:

12 3 4 5 6 7 8 9 10 11 12 13 14
使用Acme客户端客户端客户端();客户端->请求(“得到”' / ');//选择并点击一个链接链接履带->selectLink (“欧宝体育电话文档”->链接();客户端->点击(链接);//返回主页履带客户端->回();//进入文档页面欧宝体育电话履带客户端->转发();

方法删除客户端的历史记录重启()方法。这也将删除所有的cookie:

1 2 3 4 5 6 7
使用Acme客户端客户端客户端();客户端->请求(“得到”' / ');//重置客户端(历史记录和cookie也被清除)客户端->重启();

外部HTTP请求

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

首先,安装和配置HttpClient组件.然后,使用HttpBrowser创建发出外部HTTP请求的客户端:

1 2 3 4
使用欧宝娱乐app下载地址组件BrowserKitHttpBrowser使用欧宝娱乐app下载地址组件HttpClientHttpClient浏览器HttpBrowser (HttpClient::create ());

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

1 2 3 4 5 6 7 8
浏览器HttpBrowser (HttpClient::create ());浏览器->请求(“得到”“https://github.com”);浏览器->clickLink (“登录”);浏览器->submitForm (“登录”, (“登录”= >'...'“密码”= >'...']);openPullRequests=修剪(浏览器->clickLink (“请求”->过滤器('.table-list-header-toggle答:nth-child(1)”->text ());
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。
欧宝娱乐app下载地址Symfony 5.3支持通过JoliCode