Php 在web爬虫中处理AJAX块或手动创建输入
基于Alvin Bunk的文章,我想创建一个web cralwer,在网站上登录,然后提交表单 我的问题是,在那个网站上有一个Ajax块,在点击后生成,空链接我需要填写的输入很少,所以我需要以某种方式点击那个空链接或手动插入输入 我用很多方法修改了下面的代码,试图让它正常工作,但在访问功能上我遇到了问题 I get未捕获错误:在null上调用成员函数visit()Php 在web爬虫中处理AJAX块或手动创建输入,php,forms,symfony,phpunit,web-crawler,Php,Forms,Symfony,Phpunit,Web Crawler,基于Alvin Bunk的文章,我想创建一个web cralwer,在网站上登录,然后提交表单 我的问题是,在那个网站上有一个Ajax块,在点击后生成,空链接我需要填写的输入很少,所以我需要以某种方式点击那个空链接或手动插入输入 我用很多方法修改了下面的代码,试图让它正常工作,但在访问功能上我遇到了问题 I get未捕获错误:在null上调用成员函数visit() <?php require 'vendor/autoload.php'; trait MinkSetup { pr
<?php
require 'vendor/autoload.php';
trait MinkSetup
{
private $minkBaseUrl;
private $minkSession;
/**
* @before
*/
public function setupMinkSession()
{
$this->minkBaseUrl = 'https://www.url.com';
$driver = new \Behat\Mink\Driver\Selenium2Driver('firefox');
$this->minkSession = new \Behat\Mink\Session($driver);
$this->minkSession->start();
}
public function getCurrentPage()
{
return $this->minkSession->getPage();
}
public function getCurrentPageContent()
{
return $this->getCurrentPage()->getContent();
}
public function visit($url)
{
echo $url;
$this->minkSession->visit($url);
}
public function login($user, $pass){
$this->minkSession->visit('complete url');
$page = $this->getCurrentPage();
echo $page;
$page->fillField('email', $user); // Enter username.
$page->fillField('password', $pass); // Enter password.
$page->pressButton('Login');
$content = $this->getCurrentPageContent();
$this->assertContains('logout', $content);
}
/**
* @afterClass
*/
public function logout(){
$page = $this->getCurrentPage();
$page->clickLink('logout');
}
}
use PHPUnit\Framework\TestCase;
class MinkPetitionTest extends TestCase
{
use MinkSetup;
public function testSubmitPage(){
$this->login('user', 'pw'); // Login first.
$this->visit('full url');
$page = $this->getCurrentPage(); // Get the page.
echo $page;
$page->fillField('form_ban_id', '1234');
$page->pressButton('form_find_student');
$content = $this->getCurrentPageContent(); // Get page content.
$this->assertContains('<u>No Petitions</u> exist for Some User Student ID: 1234', $content);
}
}
$client = new MinkPetitionTest(); //tried to get something to work
$client->testSubmitPage(); //same here
如果您使用的是最新的phpunit,则需要像这样更改测试类:
...
use PHPUnit\Framework\TestCase;
class MinkPetitionTest extends TestCase
{
...
你能先试试看结果吗
编辑#2
此外,您的trait文件不正确。应该是:
trait MinkSetup
{
private $minkBaseUrl;
...
public function visit($url)
{
$this->minkSession->visit($this->minkBaseUrl . $url);
}
...
尝试一下如果您使用的是最新的phpunit,您需要像这样更改测试类:
...
use PHPUnit\Framework\TestCase;
class MinkPetitionTest extends TestCase
{
...
你能先试试看结果吗
编辑#2
此外,您的trait文件不正确。应该是:
trait MinkSetup
{
private $minkBaseUrl;
...
public function visit($url)
{
$this->minkSession->visit($this->minkBaseUrl . $url);
}
...
尝试相同的未捕获错误:调用成员函数visit(),在visit函数中为null,我更新了代码您输入的代码是否错误?您有$this->访问(完整url')
但是参数应该被引用,如下所示:$this->visit('full url')代码>。关于trait文件,请参见我的编辑2。确保您正在按照我的教程复制代码。应该有一些小的改变。我只是用完整的url做了一个例子,链接是正确的,访问功能不起作用,也改变为使用私有常量,但是访问总是为空的,因为某些原因,你对处理ajax块有其他想法吗?你的命名空间匹配吗!???这些文件需要位于tests\AppBundle\Functional
文件夹中;如果不是,你会得到各种各样的错误。在您这边进行一点故障排除可能会有所帮助。相同的未捕获错误:在visit函数的null上调用成员函数visit(),我更新了代码您是否输入了错误的代码?您有$this->访问(完整url')
但是参数应该被引用,如下所示:$this->visit('full url')代码>。关于trait文件,请参见我的编辑2。确保您正在按照我的教程复制代码。应该有一些小的改变。我只是用完整的url做了一个例子,链接是正确的,访问功能不起作用,也改变为使用私有常量,但是访问总是为空的,因为某些原因,你对处理ajax块有其他想法吗?你的命名空间匹配吗!???这些文件需要位于tests\AppBundle\Functional
文件夹中;如果不是,你会得到各种各样的错误。在你这边进行一点故障排除可能会有所帮助。我更新了我的貂皮文章,其中包含phpunit更改所需的更改。您好,King。你有AJAX代码的副本吗?我已经准备好了一个Mink项目,很快就可以进入github,然而,使用Mink的全部意义在于Javascript或AJAX;所以我需要了解您使用的代码。你也可以把它发布在pastebin上并复制URL。我用phpunit更改所需的更改更新了我的Mink文章。你好,King。你有AJAX代码的副本吗?我已经准备好了一个Mink项目,很快就可以进入github,然而,使用Mink的全部意义在于Javascript或AJAX;所以我需要了解您使用的代码。您还可以将其发布到pastebin并复制URL。