2016-05-27 1 views
0

私は、Mink + Zombieドライバ(nodejs cannot find module 'zombie' with PHP minkとしてインストール)でPHPスクリプトを使用しています:PHP Mink/Zombie - page visit returns status code 0?;完全を期すために再掲載:PHP Mink/Zombie - 致命的な例外の後にハングするプロセスを処理しますか?

<?php 
$nodeModPath = "/home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules"; 

# composer autoload: 
require_once __DIR__ . '/vendor/autoload.php'; 

$URL = "https://demo.centreon.com/centreon"; 
$USERNAME = "admin"; 
$PASSWORD = "centreon"; 
$LFID = "useralias"; 
$PFID = "password"; 
$BFID = "submitLogin"; 


$zsrv = new \Behat\Mink\Driver\NodeJS\Server\ZombieServer(); 
$zsrv->setNodeModulesPath($nodeModPath . "/"); # needs to end with a trailing '/' 
$driver = new \Behat\Mink\Driver\ZombieDriver($zsrv); 
$session = new \Behat\Mink\Session($driver); 

// start the session 
$session->start(); 
$session->setRequestHeader('User-Agent', 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36'); 

$statcode = 0; 
while ($statcode != 200) { 
    $isleep = rand(2, 7); echo "sleeping $isleep sec...\n"; 
    sleep($isleep); 
    $session->visit($URL); 
    // $session->wait(20000, '(0 === jQuery.active)'); # Uncaught exception 'RuntimeException' with message 'Could not establish connection: Connection refused (111)' 
    $session->wait(20000, '(browser.statusCode > 0)'); ### THIS makes things work?! 
    $statcode = $session->getStatusCode(); 
    echo " current URL: " . $session->getCurrentUrl() ."\n"; 
    echo " status code: " . $statcode ."\n"; 
} 

$page = $session->getPage(); 
$el_login = $page->findField($LFID); 
$el_password = $page->findField($PFID); 
$el_button = $page->find('xpath', '//*[@name="'.$BFID.'"]');//findById($BFID);//findField($BFID); 

$el_login->setValue($USERNAME); 
$el_password->setValue($PASSWORD); 

echo " pressing/clicking login button\n"; 
$el_button->click(); 

echo "Page URL after click: ". $session->getCurrentUrl() . "\n"; 
$page = $session->getPage(); 
?> 

スクリプトが実行され、ログインをクリックし、ページの用途はミンクによって検出することができないいくつかのJavaScriptライブラリを行い、そして例外が発生したときに問題が、次のとおりです。

$ php test_php_mink.php 
sleeping 4 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 at Object.DOM.languageProcessors.javascript (/home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules/zombie/lib/dom/scripts.js:26:12)\n at define.proto._eval (/home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules/zombie/node_modules/jsdom/lib/jsdom/level2/html.js:1477:47)\n at /home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules/zombie/node_modules/jsdom/lib/jsdom/browser/resource-loader.js:32:22\n at Object.item.check (/home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules/zombie/node_modules/jsdom/lib/jsdom/level2/html.js:188:11)\n at Object.item.check (/home in /path/to/test_php_mink/vendor/behat/mink-zombie-driver/src/ZombieDriver.php on line 880 

例外はReferenceError: Effect is not definedであり、それはこのJavaScriptを使用してページによるものです:

<script type="text/javascript" src="./include/common/javascript/scriptaculous/scriptaculous.js?load=effects,dragdrop"></script> 
... 
    new Effect.toggle('header', 'appear', { afterFinish: function() { 

はしかし、さらに大きな問題はWHそして、このクラッシュの後に起こるということです

$ php test_php_mink.php 
PHP Fatal error: Uncaught exception 'RuntimeException' with message 'Server process has been terminated: (1) [events.js:141 
     throw er; // Unhandled 'error' event 
    ^

Error: listen EADDRINUSE 127.0.0.1:8124 
    at Object.exports._errnoException (util.js:837:11) 
    at exports._exceptionWithHostPort (util.js:860:20) 
    at Server._listen2 (net.js:1231:14) 
    at listen (net.js:1267:10) 
    at net.js:1376:9 
    at doNTCallback3 (node.js:440:9) 
    at process._tickCallback (node.js:346:17) 
    at Function.Module.runMain (module.js:473:11) 
    at startup (node.js:117:18) 
    at node.js:951:3 
]' in /path/to/test_php_mink/vendor/behat/mink-zombie-driver/src/NodeJS/Server.php:413 
Stack trace: 
#0 /path/to/test_php_mink/vendor/behat/mink-zombie-driver/src/NodeJS/Server.php(306): Behat\Mink\Driver\NodeJS\Server->checkAvailability() 
#1 /path/to/test_php_mink/vendor/behat/mink-zombie-driver/src/ZombieDriver. in /path/to/test_php_mink/vendor/behat/mink-zombie-driver/src/NodeJS/Server.php on line 413 

最初のクラッシュの後、ぶらぶらminkプロセスが残っているようだ - と確かに、あります:私は二度目のスクリプトを実行する途中、それは、ほとんどすぐにError: listen EADDRINUSE 127.0.0.1:8124と、この時間をクラッシュ

この時点で
$ pgrep -fl mink 
7659 sh 
7660 node 

$ ps axf | grep mink 
7687 pts/0 S+  0:00 |  \_ grep --color=tty mink 
7659 pts/0 S  0:00 sh -c 'node' '/path/to/test_php_mink/vendor/behat/mink-zombie-driver/bin/mink-zombie-server.js' 
7660 pts/0 Sl  0:03 \_ node /path/to/test_php_mink/vendor/behat/mink-zombie-driver/bin/mink-zombie-server.js 

私はこれらのプロセスを殺す場合は、 - その後、彼らはプロセスツリーから消え、その後、私は(OPの最初の呼び出しと同じ結果で、再びスクリプトを実行することができます - pkill -f minkと、言いますプロセスをもう一度killする必要があります)。

これを処理するにはどのようなベスト/推奨方法がありますか?そのため、スクリプトが致命的な例外に達するたびにプロセスを手動で強制終了する必要はありません。これを可能にする何かがMinkライブラリにありますか?

+0

注、Iは、iojs-v3.3.1 nodejsバージョンとゾンビV4.2.1、4.0.0、4.4.5でこれをテストしました6.2.0 - これらはすべて同じようにこのスクリプトで失敗します。 – sdbbs

答えて

1

致命的な例外を避けるためにまず行うべきことは、適切なエラー処理を使用してメソッドを実装することです。 要素がnullでないかどうか、およびカスタム例外をスローするかどうかを確認するメソッドを作成できます。要素が見つからない場合は、あなたのケースでは例えば

findField方法は のsetValueは致命的なエラーが生じ非オブジェクトで使用する電子うこの場合には、nullを返します。

+0

ありがとうございました。@lauda - 私は、適切なエラー処理でメソッドを実装する方法についてはまだ明確ではありませんが、私はそれを見ていきます...乾杯! – sdbbs

+0

OK、もう少しテストをしましたが、私は 'echo" Check:el_l: "を実行しました。 gettype($ el_login)。 " エル・P: " 。 gettype($ el_password)。 "el_b" gettype($ el_button)。 "\ n"; '' findField'コマンドの後ろにあり、オブジェクトのどれもnullではありません: 'Check:el_l:object el_p:object el_b object'。したがって、OPで述べたように 'setValue()'や 'click()'が非オブジェクト上で呼び出されるため例外は**発生しません。例外は 'click'メソッドのどこかで発生します。 exter JSクラスが見つかりません。だから、質問はまだ開いています... – sdbbs

+1

どのように$ BFIDを設定しますか?あなたはクリックする必要がありますか、スライダなどがありますか?特別なケースでクリックアクションが他のケースで動作している場合は、このケースではexecuteScriptを使用しようとしましたか? – lauda

0

例外処理の例である:

public function fillWith($locator, $text){ 
 
     $element = $this->getSession()->getPage()->find("xpath", $locator); 
 

 
     if($element === null){ 
 
      throw new Exception("Element $locator not found"); 
 
     }else{ 
 
      $element->setValue($text); 
 
     } 
 
    }

+0

ありがとう@lauda - この情報を入れるためにあなたの古い答えを編集したはずです。それでも、非オブジェクト例外処理がここでは問題ではないという事実は変わりません... – sdbbs

関連する問題