2017-02-02 4 views
0

Im пытается автоматизировать очистку информации с веб-сайта с помощью аутентификации пользователя с помощью PhantomJS. Чтобы получить доступ к форме входа на страницу, пользователю необходимо нажать кнопку, которая запускает функцию javascript, которая рисует форму. В моем коде im просто вызывает указанную функцию js, чтобы нарисовать форму, и попытайтесь затем заполнить поля. Проблема в том, что phantomjs не находит новые нарисованные элементы. С другой стороны, если я сделаю снимок экрана после вызова функции, я могу видеть элементы на ней. Доступ к другим элементам формы на странице работает без проблем, поэтому я думаю, что проблема может заключаться в том, что phantomjs пытается получить доступ к элементам до их полного рисования.PhantomJs: элементы доступа, нарисованные функцией js

Вот мой код:

var page = require('webpage').create(); 
url = "http://websiteURL.bla"; 
page.open(url, function(status) { 

    if (status === "success") { 
    page.evaluate(function() { 
     netbar_login_signup() //js function to show login form 
    }); 
    page.evaluate(function() { //wait a few seconds, then fill the fields 
    document.getElementById("gsnet_login_name").value = "name"; 
    document.getElementById("gsnet_login_passwd").value = "password"; 
    document.getElementById("gsnet_login_submit").click(); 
    },3000); 
    window.setTimeout(function() { //wait a few more seconds, then take screenshot 
     page.render("page.png"); 
    },5000); 

    } 
}); 

Любой сталкивались с подобными проблемами или знает решение моей?

ответ

0

Вы почти получили это право, но в течение первого периода ожидания.

page.evaluate действительно может принимать дополнительные аргументы после функции, но это не таймауты, это просто аргументы, которые необходимо передать внутри страницы. Оценить. Итак, чтобы ждать, мы должны использовать setTimeout в обоих случаях.

var page = require('webpage').create(); 
url = "http://websiteURL.bla"; 
page.open(url, function(status) { 

    // This looks a bit cleaner, less nesting 
    if (status !== "success") { 
     console.log(status); 
     phantom.exit(1); // 1 = error exit code 
    } 

    page.evaluate(function() { 
     netbar_login_signup() //js function to show login form 
    }); 

    // from this moment both setTimeout functions are executed simultaneously 
    // the difference is that the second is waiting for 2 seconds longer 

    // wait three seconds, then fill the fields 
    setTimeout(function() { 
     page.evaluate(function() { 
      document.getElementById("gsnet_login_name").value = "name"; 
      document.getElementById("gsnet_login_passwd").value = "password"; 
      document.getElementById("gsnet_login_submit").click(); 
     }); 
    }, 3000); 

    // wait two more seconds, then take screenshot 
    setTimeout(function() { 
     page.render("page.png"); 
     phantom.exit(); // phantom.exit(0) // success exit code 
    }, 5000); 

});