PHP水貂/僵尸-页面访问返回状态代码0?

PHP水貂/僵尸-页面访问返回状态代码0?,php,node.js,mink,Php,Node.js,Mink,我应该在服务器上测试登录,而不是在我的控制下,即HTTPS,在PHP中使用Mink和Zombie驱动程序。问题是,每当我访问登录页面时,我通常都会得到状态代码0,因此我无法处理任何元素。我曾尝试使用Wireshark来检查网络流量——但由于它是HTTPS,所以它是加密的,我不知道Wireshark捕获中发生了什么;我只能看到一些数据已与服务器交换 我无法共享我试图访问的实际页面的URL,但我发现我可以用Centreon的公开演示来演示它(更多信息;提前向Centreon道歉)。下面是一个复制此问

我应该在服务器上测试登录,而不是在我的控制下,即HTTPS,在PHP中使用Mink和Zombie驱动程序。问题是,每当我访问登录页面时,我通常都会得到状态代码0,因此我无法处理任何元素。我曾尝试使用Wireshark来检查网络流量——但由于它是HTTPS,所以它是加密的,我不知道Wireshark捕获中发生了什么;我只能看到一些数据已与服务器交换

我无法共享我试图访问的实际页面的URL,但我发现我可以用Centreon的公开演示来演示它(更多信息;提前向Centreon道歉)。下面是一个复制此问题的示例(我的安装如上所示):


好吧,我找到了一些东西,但我真的不确定这些东西应该如何工作——因此,如果能提供一个更具学识的答案,我将不胜感激

无论如何,我进行了一些实验,最终我发现
$session->getStatusCode()
/vendor/behat/mink zombie driver/src/zombie driver.php中(很可能)定义为:

公共函数getStatusCode()
{
return(int)$this->server->evalJS('browser.statusCode','json');
}
因此,基本上,它读取JavaScript属性
browser.statusCode
。事实证明,如果我们等待足够长的时间来更改此状态代码,那么页面加载将继续进行,最终我将获得状态代码200(同样,这适用于普通浏览器始终正确读取页面,从而确认网络正常运行的情况)。这就是我所做的改变:

$statcode=0;
而($statcode!=200){
$isleep=rand(2,7);回显“睡眠$isleep秒…\n”;
睡眠($isleep);
$session->visit($URL);
//$session->wait(20000),(0==jQuery.active);#未捕获异常“RuntimeException”,消息为“无法建立连接:连接被拒绝(111)”
$session->wait(20000),(browser.statusCode>0);#####这让事情正常了?!
$statcode=$session->getStatusCode();
回显“当前URL:”.$session->getCurrentUrl()。“\n”;
回显“状态代码:“.$statcode”。\n”;
}
注:

  • 我发现等待条件
    (0==jQuery.active)
    开启;然而,在这里它似乎导致了带有消息“无法建立连接:连接被拒绝(111)”的
    “RuntimeException”
  • 即使在
    (browser.statusCode>0)
    等待条件下,如果我只是使用随机睡眠延迟(即
    wait(0)),它也会像在OP中一样失败
    -这可能是因为
    $isleep
    以秒为单位,而
    wait()
    需要毫秒;在我显式地将等待时间设置为20000(毫秒=20秒;但脚本完成的时间要早于此)之后,脚本开始工作
现在,在过去的10-15次运行脚本中,我得到了以下结果:

$ php test_php_mink_timeout.php 
sleeping 6 sec...
  current URL: https://demo.centreon.com/centreon/
  status code: 200
  pressing/clicking login button
PHP Fatal error:  Uncaught exception 'Behat\Mink\Exception\DriverException' with message 'Error while processing event 'click': "ReferenceError: Effect is not defined\n    at https://demo.centreon.com/centreon/include/common/javascript/modalbox.js:517:1\n    at Object.exports.runInContext (vm.js:44:17)\n    at window._evaluate (/home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules/zombie/lib/document.js:253:75)\n ...

。。。这使得连接/状态代码0问题似乎通过此
wait()
解决了。然而,还有另一个问题——页面使用的一个JavaScript类找不到,程序崩溃了——更糟糕的是,有
mink
进程挂在后台,在我杀死它们之前,我无法再次运行脚本。但我会为此发布另一个问题。。。在这里,我这样做了:

嗯,我发现了一些东西,但我真的不确定事情应该如何运作——因此,一个更具学识的答案将不胜感激

无论如何,我进行了一些实验,最终我发现
$session->getStatusCode()
/vendor/behat/mink zombie driver/src/zombie driver.php中(很可能)定义为:

公共函数getStatusCode()
{
return(int)$this->server->evalJS('browser.statusCode','json');
}
因此,基本上,它读取JavaScript属性
browser.statusCode
。事实证明,如果我们等待足够长的时间来更改此状态代码,那么页面加载将继续进行,最终我将获得状态代码200(同样,这适用于普通浏览器始终正确读取页面,从而确认网络正常运行的情况)。这就是我所做的改变:

$statcode=0;
而($statcode!=200){
$isleep=rand(2,7);回显“睡眠$isleep秒…\n”;
睡眠($isleep);
$session->visit($URL);
//$session->wait(20000),(0==jQuery.active);#未捕获异常“RuntimeException”,消息为“无法建立连接:连接被拒绝(111)”
$session->wait(20000),(browser.statusCode>0);#####这让事情正常了?!
$statcode=$session->getStatusCode();
回显“当前URL:”.$session->getCurrentUrl()。“\n”;
回显“状态代码:“.$statcode”。\n”;
}
注:

  • 我发现等待条件
    (0==jQuery.active)
    开启;然而,在这里它似乎导致了带有消息“无法建立连接:连接被拒绝(111)”的
    “RuntimeException”
  • 即使在
    (browser.statusCode>0)
    等待条件下,如果我只是使用随机睡眠延迟(即
    wait(0)),它也会像在OP中一样失败
    -这可能是因为
    $isleep
    以秒为单位,而
    wait()
    需要毫秒;在我显式地将等待时间设置为20000(毫秒=20秒;但脚本完成的时间要早于此)之后,脚本开始工作
现在,在过去的10-15次运行脚本中,我得到了以下结果:

$ php test_php_mink_timeout.php 
sleeping 6 sec...
  current URL: https://demo.centreon.com/centreon/
  status code: 200
  pressing/clicking login button
PHP Fatal error:  Uncaught exception 'Behat\Mink\Exception\DriverException' with message 'Error while processing event 'click': "ReferenceError: Effect is not defined\n    at https://demo.centreon.com/centreon/include/common/javascript/modalbox.js:517:1\n    at Object.exports.runInContext (vm.js:44:17)\n    at window._evaluate (/home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules/zombie/lib/document.js:253:75)\n ...
。。。这使得连接/状态代码0问题似乎通过此
wait()
解决了。然而,还有另一个问题——页面使用的一个JavaScript类找不到,程序崩溃了——更糟糕的是,有
mink
进程挂在后台,在我杀死它们之前,我无法再次运行脚本。但我会为此发布另一个问题。。。在这里: