BrowserKit组件模拟浏览器行为,让你能够程序化地制造请求、对链接的点击以及表单提交。
安装 ¶
你可以通过下述两种方式安装:
然后,包容vendor/autoload.php文件,以开启Composer提供的自动加载机制。否则,你的程序将无法找到这个Symfony组件的类。
基本用法 ¶
创建Client ¶
本组件只提供抽象的client,并不提供任何可以用于HTTP层的后端。
要创建你自己的客户端,必须继承 Client 抽象类,然后实现其
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15namespace Acme;
use Symfony\Component\BrowserKit\Client as BaseClient;
use Symfony\Component\BrowserKit\Response;
class Client extends BaseClient
{
protected function doRequest($request)
{
// ... convert request into a response
// ... 把请求转换为响应
return new Response($content, $status, $headers);
}
}
基于HTTP layer的一个简单的client实现,可以看看 Goutte。基于 HttpKernelInterface 的实现,看一下由 HttpKernel组件 提供的
制造请求 ¶
使用
1
2
3
4use Acme\Client;
$client = new Client();
$crawler = $client->request('GET', 'http://symfony.com');
由 request() 方法返回的值,是一个 DomCrawler组件,该组件能够程式化地访问和遍历HTML元素。
点击链接 ¶
Crawler 对象有能力模拟对链接的点击。首先,把链接的文本传入 selectLink() 方法,该方法返回一个 Link 对象。然后再把这个对象传入 click() 方法, 该方法负责把所需的HTTP GET请求模拟成链接点击:
1
2
3
4
5
6use Acme\Client;
$client = new Client();
$crawler = $client->request('GET', 'http://symfony.com');
$link = $crawler->selectLink('Go elsewhere...')->link();
$client->click($link);
提交表单 ¶
Crawler 对象有能力选择表单。首先,用 selectButton() 方法来选择任意表单的按钮。然后,使用 form() 来选择该按钮的归属表单。
选择了表单之后,填充表单数据,并使用 submit() 方法(利用所需的HTTP POST请求来提交表单内容) 来发送表单:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16use Acme\Client;
// make a real request to an external site
// 制造一个对外部网站的真实请求
$client = new Client();
$crawler = $client->request('GET', 'https://github.com/login');
// select the form and fill in some values
// 选取表单,并填充一些值
$form = $crawler->selectButton('Log in')->form();
$form['login'] = 'symfonyfan';
$form['password'] = 'anypass';
// submit that form
// 提交此表单
$crawler = $client->submit($form);
Cookies ¶
取出Cookie ¶
The Client implementation exposes cookies (if any) through a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26use Acme\Client;
// Make a request
// 制造一个请求
$client = new Client();
$crawler = $client->request('GET', 'http://symfony.com');
// Get the cookie Jar
// 取得饼干罐对象
$cookieJar = $client->getCookieJar();
// Get a cookie by name
// 根据cookie名称取得cookie
$cookie = $cookieJar->get('name_of_the_cookie');
// Get cookie data
// 取得cookie数据
$name = $cookie->getName();
$value = $cookie->getValue();
$raw = $cookie->getRawValue();
$secure = $cookie->isSecure();
$isHttpOnly = $cookie->isHttpOnly();
$isExpired = $cookie->isExpired();
$expires = $cookie->getExpiresTime();
$path = $cookie->getPath();
$domain = $cookie->getDomain();
这些方法只返回尚未过期的cookie。
循环Cookie ¶
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31use Acme\Client;
// Make a request
// 制造一个请求
$client = new Client();
$crawler = $client->request('GET', 'http://symfony.com');
// Get the cookie Jar
// 取得饼干罐对象
$cookieJar = $client->getCookieJar();
// Get array with all cookies
// 取得全部cookie的数组
$cookies = $cookieJar->all();
foreach ($cookies as $cookie) {
// ...
}
// Get all values
// 获取全部cookie的值
$values = $cookieJar->allValues('http://symfony.com');
foreach ($values as $value) {
// ...
}
// Get all raw values
// 获取全部原生的值
$rawValues = $cookieJar->allRawValues('http://symfony.com');
foreach ($rawValues as $rawValue) {
// ...
}
设置Cookie ¶
你也可以创建cookie并把它们装到cookie Jar中,以便将饼干罐注入到客户端的构造器中:
1
2
3
4
5
6
7
8
9use Acme\Client;
// create cookies and add to cookie jar
// 创建cookie并添加到cookie Jar
$cookieJar = new Cookie('flavor', 'chocolate', strtotime('+1 day'));
// create a client and set the cookies
// 创建client并设置cookie
$client = new Client(array(), array(), $cookieJar);
历史 ¶
客户端存有你的全部请求,允许你在历史记录中回退和前进:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19use Acme\Client;
// make a real request to an external site
// 制造一个对外部网站的真实请求
$client = new Client();
$client->request('GET', 'http://symfony.com');
// select and click on a link
// 选中并点击一个链接
$link = $crawler->selectLink('Documentation')->link();
$client->click($link);
// go back to home page
// 退回首页
$crawler = $client->back();
// go forward to documentation page
// 前进到文档页
$crawler = $client->forward();
使用 restart() 可以删除客户端的历史记录。它同时会删除全部cookies:
1
2
3
4
5
6
7
8
9
10use Acme\Client;
// make a real request to an external site
// 制造一个对外部网站的真实请求
$client = new Client();
$client->request('GET', 'http://symfony.com');
// delete history
// 删除历史记录
$client->restart();