Как я могу избавиться от ошибки "Не удается найти метод объекта"warn"через пакет"sssself"в IE::Mechanize?
Я играю с Win32::IE::Mechanize. Я пытаюсь сценарий для автоматического доступа к шести из моих учетных записей электронной почты в Интернете. Сценарий в основном работает, но Perl выдает некое зашифрованное сообщение "Не удается найти метод объекта" warn "через пакет"sssself" (возможно, вы забыли загрузить" sssself) ". Несмотря на ошибку, скрипт все еще может выполнить свою работу Но я хочу избавиться от этого и понять, почему это происходит. Ниже приведен сценарий. Пожалуйста, прокомментируйте, где я могу улучшить код. Спасибо, как всегда.
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" (возможно, вы забыли загрузить lad "sssself"?) В строке C71 /Perl/site/lib/Win32/IE/Mechanize.pm 971.
релиз Dev 0.009_17 дает мне очень очень значимое сообщение:
Нет контроля ввода по имени "Имя пользователя" в строке E:\mailme.pl 33
Имея это в виду сообщение об ошибке, я проверил исходный файл страницы входа в систему, и оказалось, что идентификатор поля должен быть "Имя пользователя", а не "Имя пользователя".
Так что я исправил свою проблему:) Спасибо, ребята!
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";
};
}