首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在幻影中找不到表格2的元素

在幻影中找不到表格2的元素
EN

Stack Overflow用户
提问于 2017-01-04 05:53:05
回答 1查看 125关注 0票数 0

当我在phantomjs_arg中使用“--disk=true”时,它会在这一行中得到错误:

代码语言:javascript
复制
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::Mechanize::PhantomJS::signal_condition(WWW::Mechanize::PhantomJS=HASH(0x4cfa120),在/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 No 2“、”表单2“、"single”中调用的“没有找到表单2的元素”),1)在/usr/local/share/perl/5.22.1/WWW/Mechanize/PhantomJS.pm第2102行调用WWW::Mechanize::PhantomJS::form_number(WWW::Mechanize::PhantomJS=HASH(0x4cfa120),2)调用模块/TestLogin.pm第1129行TestLogin::TestLogin_login(TestLogin=HASH(0x4f5c8a8)),调用collectBets.pl第20行调试程序终止。使用q退出或R重新启动,使用o inhibit_exit避免程序终止后停止,h,h或h获得额外的信息。

如果没有磁盘,它就能正常工作。这是我的示例代码,以便更好地理解。

代码语言:javascript
复制
#!/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;
}
EN

回答 1

Stack Overflow用户

发布于 2017-01-04 09:10:19

在查看磁盘缓存参数之前,我发现没有这样的元素。

代码语言:javascript
复制
# 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"]' });

具有磁盘缓存或没有磁盘缓存的简单工作脚本:

代码语言:javascript
复制
#! /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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41457035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档