在phantomjs中找不到2号表格的元素

时间:2017-01-04 05:53:05

标签: perl phantomjs

当我在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;
}

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;
}