当我在phantomjs_arg中使用“--disk-cache = true”时,它会收到错误在这一行:
my $form = $self->{obj_mech}->form_number( 2 );
在模块/ TestLogin.pm第1129行找不到表单编号2的元素。 在/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 ::机械化:: PhantomJS ::的xpath(WWW ::机械化:: PhantomJS = HASH(0x4cfa120), “(// form)[2]”,“user_info”,“表单编号2”,“单个”,1)调用于 /usr/local/share/perl/5.22.1/WWW/Mechanize/PhantomJS.pm 2102行 WWW ::机械化:: PhantomJS :: form_number(WWW ::机械化:: PhantomJS = HASH(0x4cfa120), 2)在modules / TestLogin.pm第1129行调用 在collectBets.pl第20行调用的TestLogin :: TestLogin_login(TestLogin = HASH(0x4f5c8a8))调试程序终止。使用q退出 或者R重新启动,使用o inhibit_exit以避免程序后停止 终止,h q,h R或h o以获取更多信息。
没有磁盘 - 它工作正常。 这是我更好理解的示例代码。
#!/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 :(得分: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;
}