2014-11-09 3 views
1

Я пытаюсь автоматизировать тяжелую страницу javascript в Perl, используя Mechanize::PhantomJS. Существует некоторый javascript, который выполняется на странице после того, как пользователь щелкает либо в порядке, либо отменяет подтверждение подтверждения. Так как я не знаю, как нажимать хорошо, я выполняю javascript напрямую. проблемы в том, что следующий скрипт работает нормально при использовании Firefox (здесь я использую Mechanize::Firefox), но не дает никакого результата при использовании Mechanize::PhantomJSeval_in_page Выполнение javascript работает в firefox, но не в phantomjs

$mech->eval_in_page(<<'JS'); 
    closeChildWindows(); 
    commandInProgress = true; 
    document.dataForm.target="_self"; 
    document.dataForm.method='post'; 
    document.dataForm.action="ReviewApptAction"; 
    document.dataForm.submit(); 
JS 

В PhantomJS, сценарий проходит через эти линии, не производя какие-либо ошибки но ничего не выполняет на странице, то есть я не получаю никакого результата, например, отправки формы в конце. Кто-нибудь знает, что здесь происходит?

Я хочу использовать Mechanize::PhantomJS, потому что он позволяет мне запускать несколько экземпляров сценария одновременно, в отличие от firefox.

Позвольте мне быть более ясно: я должен нажать на кнопку, которая имеет OnClick Javascript прилагается к нему:

<a href="javascript:bookAppointment()" onmouseover="window.status='Next Screen';return true" onmouseout="window.status='';return true"> 
      <img src="../images/include/buttonnext.gif" width="61" height="16" border="0" alt="Next Screen"></a> 

Функция, что эта кнопка вызывает это:

function bookAppointment() 
{ 
    if (confirm("Book this appointment?")) 
    { 
     if (!commandInProgress) { 
       closeChildWindows(); 
       commandInProgress = true; 
       document.dataForm.target="_self"; 
       document.dataForm.method='post'; 
       document.dataForm.action="ReviewApptAction"; 
       document.dataForm.submit(); 
     } 
     else { 
       alert("Request has been submitted but not yet processed by the server. Please press OK and wait for response..."); 
     } 
    } 
    return; 

}

Во-первых, я использовал $mech->confirm('Really do this?' [ => 1 ]), чтобы щелкнуть oky в диалоговом окне подтверждения, но это не сработало. Итак, я просто выдал команды, которые следуют за щелчком.

ответ

2

Вы documentation искажения:

$mech->confirm('Really do this?' [ => 1 ])

Records a confirmation (which is "1" or "ok" by default) [...]

Как Artjom Б. говорит в комментариях [ => 1 ] указывает на то, что второй аргумент является необязательным, и это значение по умолчанию равно 1. Если вы хотите передать второй аргумент, вы должны удалить скобки, так как следующее неверный код Perl и вызовет синтаксическую ошибку:

$mech->confirm('Really do this?' [ => 1 ]); 
syntax error at ./foo line 42, near "'Really do this?' [" 
Execution of ./foo aborted due to compilation errors. 

чтобы ударить "ОК", сделайте следующее:

$mech->confirm('Really do this?' => 1); 

или с 1 по умолчанию, просто:

$mech->confirm('Really do this?'); 

Если вы хотите, чтобы отменить диалог, использование:

$mech->confirm('Really do this?' => 0); 
+1

Наконец кто-SO следует этикет (размещение в виде CW). Я никогда не использовал Perl, поэтому мне не нравится писать ответ на основе предположения. –

+1

Ну, вы пригвоздили проблему и были прав, говоря OP, чтобы написать ответ. Я использую 'WWW :: Mechanize :: PhantomJS' прямо сейчас, поэтому я решил, что быстрее будет просто сбрасывать ответ, а не ждать OP. – ThisSuitIsBlackNot

Смежные вопросы