Как я могу избавиться от ошибки "Can't locate object method" warn "via package" sssself " в IE::Mechanize?



Я играю с Win32:: IE:: Mechanize. Я пытаюсь создать скрипт для автоматического доступа к шести моим учетным записям электронной почты в интернете. Скрипт в основном работает, но perl выдает своего рода загадочную ошибку "не удается найти метод объекта "warn" через пакет "sssself" (возможно, вы забыли загрузить " sssself)". Несмотря на ошибку, сценарий все еще может выполнить работу. Но я хочу избавиться от этого и понять, почему это происходит. Ниже приведен сценарий. Пожалуйста добросердечно commment где я могу улучшить код. Спасибо, как всегда.



use strict;
use Win32::IE::Mechanize;


my @accounts = (
'http://mail.21cn.com',
'frmmail1',
{
'Username' => 'myusername',
'passwd' => 'mypassword',
},
'http://mail.126.com',
'form',
{
'user' => 'myusername',
'password' => 'mypassword',
},
......
......
......
);

sub arg{
shift (@accounts);
}

while(@accounts){
my $mech = Win32::IE::Mechanize->new(visible=>1);
my $url = arg;
my $form = arg;
my $account = arg;

$mech->get($url);
$mech->form_name($form);
eval {$mech->set_fields(%$account);};
warn $@ if $@;
$mech->click();
}


Я знаю, что что-то не так с линией



$mech->set_fields(%$account);


Но как я могу это исправить? или я должен просто удалить



warn $@ if $@;


И притворяться там нет ничего плохого?



Любые комментарии приветствуются :)



Обновить



Спасибо, @daotoad, за очистку моего уродливого кода :) я думаю, что вложенная структура гораздо более ремонтопригодна и приятна на глаза.



И спасибо тебе, @Eric, за то, что указал мне на лучшую версию рассматриваемый модуль:)



Ну, дело в том, когда Win32:: IE: Mechanize 0.009 выдает следующее загадочное сообщение об ошибке




Не удается найти объект методом "warn" через
пакет "sssself" (возможно, вы забыли
К Л ОАД "СССС"?) на
C:/Perl/site/lib/Win32/IE/Mechanize.pm
строка 971.




Релиз 0.009_17 Dev дает мне очень важное сообщение:




Нет inputcontrol по имени 'Username'
Ат E:mailme.pl строка 33




С это сообщение об ошибке в виду, я проверил исходный файл страницы входа в систему и оказалось, что поле id должно быть "имя пользователя", а не "имя пользователя".



Итак, я решил свою проблему. :)
Спасибо вам, ребята!

562   2  

2 ответов:

Похоже, что существует ошибка в Win32:: IE:: Mechanize версии 0.009. Существуетрелиз разработчика 0.009_17 , который может работать лучше. Я не проверял его, но, по крайней мере, " сам " исправлен. Если IE не является требованием, есть также WWW::Mechanize::Firefox и WWW::Mechanize, Если браузер не нужен.

У меня нет времени, чтобы дать вам действительно хороший ответ банкомата, но вот очистка кода. Взгляните на комментарии. Если у вас есть какие-либо вопросы о том, что я сделал или почему, просто прокомментируйте ниже, и я обновлю вопрос.

#!/usr/bin/perl
use strict;
use warnings;  # Use warnings - see perldoc perllexwarn

use Try::Tiny;  # Don't try to handle your own exceptions.  Try::Tiny does it better.

use Win32::IE::Mechanize;

# Use a nested structure so you don't have to keep popping stuff off a global array.   
my @accounts = (

    {   url       => 'http://mail.21cn.com',
        form_id => 'frmmail1',
        fields => {
            Username   => 'myusername',
            passwd     => 'mypassword',
        }
    },
    {   url => 'http://mail.126.com',
        form_id => 'form',
        fields => {
            user => 'myusername',
            password => 'mypassword',
        },
    },
);

# No messing about with @accounts means we can use a for loop.
for my $account (@accounts) {

    # Its not necessary to unpack these into scalars.
    # It makes sense if you are going to transform the values or use them many times.
    my $url    = $account->{url};
    my $form   = $account->{form_id};
    my $fields = $account->{fields};

    my $mech = Win32::IE::Mechanize->new(visible=>1);

    $mech->get($url);
    $mech->form_name($form);

    # Exception handling redone with Try::Tiny    
    $mech->click() if try { 
        $mech->set_fields(%$fields);
        1;
    }
    catch {
        warn "Form failed - $_\n";
    };
}

Comments

    Ничего не найдено.