8

我正在为使用 Symfony2 (2.1) 完成的应用程序做一些功能测试,但我遇到了一个问题。

当用户单击链接或其他元素时,我会加载网站的某些部分,但这些操作是使用 jQuery 和 $.post 调用执行的。如何让 Symfony2 爬虫进行这些调用?

当我做这样的事情时:

$link    = $crawler->filter('ul.line_menu a')->eq(1)->link();
$crawler = $client->click($link);

爬虫获取“a”元素的“href”并启动它,但“href”为空,并且与该元素关联了“click()”函数,阻止了“preventDefault()”的点击动作。

谢谢大家!!:)

4

3 回答 3

8

Symfony 功能测试通过直接调用 Symfony 内核来测试您的代码。它们不是通过网络浏览器运行的,因此不支持 javascript(根本不执行)。

如果没有 javascript 就无法运行您的应用程序,那么您必须使用其他工具进行功能测试。一种选择是将Mink与支持 javascript 的驱动程序之一(如Selenium2)一起使用。

于 2013-04-26T19:27:32.527 回答
4

我可以将“无头”浏览器用作PhantomJS来完成这项任务。

PhantomJS 是一个可使用 JavaScript API 编写脚本的无头 WebKit。它具有对各种 Web 标准的快速和原生支持:DOM 处理、CSS 选择器、JSON、Canvas 和 SVG。

为了简化您的工作,您可以使用 CasperJS

CasperJS 是 PhatomJS 的伴侣,它带来了极大改进的 API,以简化抓取和自动化工作流程的创建。

在您的情况下,您尝试抓取的 Web 上下文包括通过 JQuery 和 AJAX 的动态内容,如果您想使用 Javascript 来实现这一目标,CasperJS 是一个很好的选择。您可以使用它来触发事件、添加流程步骤、包含在每次 ajax 调用之后等待和验证的函数,然后再处理任何下一步。

这是一个如何使用 CasperJS 和 JQuery 抓取网站的示例: CasperJs and Jquery with chained Selects

这是一个如何使用 CasperJS 和仅 Javascript 抓取网站的示例: CasperJS 动态选择列表

于 2013-06-05T13:10:51.883 回答
1

Symfony 不支持 javascript、Ajax、Jquery。phpunit 使用它来测试 php 功能。它不是为此而生的。

您可以使用casperjs。使用 CasperJS,您可以像使用 Symfony 上的爬虫一样进行功能测试,并且您可以获得所有 javascript 和 css 代码。

于 2013-06-05T01:47:05.810 回答