2017-01-04 2 views
0

, когда я использую «--disk-кеш = истина» в phantomjs_arg тогда она становится ошибка в этой строке:элементы не найдены формы № 2 в phantomjs

my $form = $self->{obj_mech}->form_number(2); 

Нет элементов найдено для формы № 2 в модулях/TestLogin.pm строка 1129. по адресу /usr/local/share/perl/5.22.1/WWW/Mechanize/PhantomJS.pm строка 796. WWW :: Механизация :: PhantomJS :: signal_condition (WWW :: Механизировать :: PhantomJS = HASH (0x4cfa120), «Элементы, найденные для формы № 2» не вызваны по адресу /usr/local/share/perl/5.22.1/WWW/Mechanize/PhantomJS.pm, строка 1732 WWW :: Mechanize :: PhantomJS :: xpath (WWW :: Mechanize :: PhantomJS = HASH (0x4cfa120), "(// form) [2]", "user_info", "form number 2", "single" , 1), вызываемый по адресу /usr/local/share/perl/5.22.1/WWW/Mechanize/PhantomJS.pm, строка 2102 WWW :: Механизм :: PhantomJS :: form_number (WWW :: Mechanize :: PhantomJS = HASH (0x4cfa120), 2) вызывается в модулях/TestLogin.pm line 1129 TestLogin :: TestLogin_login (TestLogin = HASH (0x4f5c8a8)), вызываемый в строке collectBets.pl 20 Отладка программы завершена. Используйте q для выхода или R для перезапуска, используйте o inhibit_exit, чтобы избежать остановки после завершения программы , h q, h R или h o для получения дополнительной информации.

без диска-cashe он отлично работает. Это мой пример кода для лучшего понимания.

#!/usr/bin/perl 
use strict; 
use warnings; 
use Helper; 
use WWW::Mechanize::PhantomJS; 
use DataBase; 
use MyConfig; 
use JSON; 
use DateTime; 
use HTML::Entities; 

sub new($$) { 
    my ($class,$params) = @_; 
    my $self = $params || {}; 
    bless $self, $class; 

    $self->{obj_mech} = WWW::Mechanize::PhantomJS -> new(phantomjs_arg => ['--ssl-protocol=any','--disk-cache=true','--max-disk-cache-size=1024'], ignore_ssl_errors => 1); 
    $self->{obj_helper} = new Helper(); 
    #$self->{obj_db} = new DataBase(); 
    $self->{logged_in} = 0; 
    #$self->setTorProxy(); 
    #$self->init_market_master(); 
    return $self; 
} 

Login(); 
print "\nlogin done...\n"; 
exit; 

sub Login { 
    my ($self) = @_; 
    my $html = $self->{obj_mech}->get("https://www.gmail.com/"); 
    sleep(25); 
    $html = $self->{obj_mech}->content; 
    $self->{obj_mech}->viewport_size({ width => 1366, height => 768 }); 

    my $form = $self->{obj_mech}->form_number(2); 

    my $user_name = '*****'; 
    my $password = '******'; 

    $self->{obj_mech}->set_fields('InputEmail' =>$user_name); 

    $self->{obj_mech}->set_fields('InputPassword' =>$password); 

    $self->{obj_mech}->click({ xpath => '//button[@class="PrimaryButton"]' }); 
    sleep(20); 
    my $test_html=$self->{obj_mech}->content; 
    $self->{obj_helper}->writeFileNew("TestLoginPage.html" , $test_html); 
    my $png = $self->{obj_mech}->content_as_png(); 
    $self->{obj_helper}->writeFileNew("LoginPage.png" , $png); 
    return 1; 
} 

ответ

0

Ну, прежде чем смотреть на аргументы дискового кэша, я обнаружил, что таких элементов нет.

# There is only 1 form. If you want to keep this line, 
# you need to change the form number to 1 
my $form = $self->{obj_mech}->form_number(2); 

# I didn't find input field named 'InputEmail' 
# The actual field name is 'Email' 
$self->{obj_mech}->set_fields('InputEmail' =>$user_name); 

# You have to click 'Next' button firstly then the password 
# input box is shown. And the field name should be 'Passwd' 
$self->{obj_mech}->set_fields('InputPassword' =>$password); 

# The xpath of 'Sign in' button is //input[@value="Sign in"] 
$self->{obj_mech}->click({ xpath => '//button[@class="PrimaryButton"]' }); 

Простой рабочий сценарий либо с дисковым кэшем или без дискового кэша:

#! /usr/bin/perl 

use strict; 
use warnings; 
use WWW::Mechanize::PhantomJS; 
use open ':std', ':encoding(UTF-8)'; 

#my $p = WWW::Mechanize::PhantomJS->new(phantomjs_arg=>['--ssl-protocol=any','--disk-cache=false','--max-disk-cache-size=1024'],ignore_ssl_errors=>1); 
my $p = WWW::Mechanize::PhantomJS->new(phantomjs_arg=>['--ssl-protocol=any','--disk-cache=true','--max-disk-cache-size=1024'],ignore_ssl_errors=>1); 

my $html = $p->get("https://www.gmail.com/"); 
sleep(5); 
write_html('first-page.html', $p->content); 

$p->viewport_size({width=>1366,height=>768}); 
my $form = $p->form_number(1); 

my $user_name = '*****'; 
my $password = '*****'; 

$p->set_fields('Email'=>$user_name); 
sleep(5); 

$p->click({xpath=>'//input[@value="Next"]'}); 
sleep(5); 
write_html('after-click-next.html', $p->content); 

$p->set_fields('Passwd'=>$password); 
sleep(5); 

$p->click({xpath=>'//input[@value="Sign in"]'}); 
sleep(5); 
write_html('after-login.html', $p->content); 

sub write_html { 
    my ($file, $content) = @_; 
    open my $fh, '>', $file or die; 
    print $fh $content; 
    close $fh; 
} 

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

  • Нет связанных вопросов^_^