Как я могу избавиться от ошибки "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 должно быть "имя пользователя", а не "имя пользователя".
Итак, я решил свою проблему. :)
Спасибо вам, ребята!
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