我有一个asp.net表单,我想自动提交以便刮取结果(BTW,我做的一切都是合法的)。
部分表单下拉输入字段通过ajax即时填充。一个字段是“区域”字段,一旦选择了一个区域,就会填充“城市”下拉列表。如果我在通过Goutte web-crawler输入区域后尝试输入城市,则会引发无效值错误。
这可以通过Goutte完成,还是应该使用其他东西?
目标表单本身是在带有viewstate
和eventvalidation
字段的asp.net中编写的。
答案 0 :(得分:0)
与使用客户端javascript代码大量实现的网站进行交互几乎是困难甚至是不可能的。像Goutte和BrowserKit这样的无头浏览器模拟器不知道这样的客户端代码,也无法执行它。您需要使用像Selenium或Sahi这样的浏览器控制器。
看看Behat的Mink,它有无头模拟器的各种驱动程序以及成熟的浏览器控制器。使用其selenium2驱动程序,您只需与目标页面进行交互即可。这是一个例子:
<?php
// You need to run selenium-*.jar for this to work.
use Behat\Mink\{Mink, Session, Driver\Selenium2Driver};
$mink = new Mink([
'selenium2' => new Session(
new Selenium2Driver('firefox', null, 'http://example.com')
),
));
$page = $mink->getSession('selenium2')->getPage();
$page->findField('regoin-select-field-name')
->selectOption('target-region-value');
$page->wait(5000, 'JS code to check if the select is now populated...')
->select('city-select-field-name)
->selectOption('target-city-value');
这是未经测试的代码,但你明白了。另请参阅how wait()
works。
另外,您可能需要查看facebook/php-webdriver;用于selenium webdriver的PHP客户端,而不是使用Mink。