2009-06-09 5 views
5

Я очень новичок в Perl, и я учусь на лету, пока я пытаюсь автоматизировать некоторые проекты для работы. До сих пор было очень весело.Как использовать и отлаживать WWW :: Механизировать?

Я работаю над созданием отчета для клиента. Я могу получить этот отчет с веб-страницы, к которой я могу получить доступ. Сначала мне нужно заполнить форму моим именем пользователя, паролем и выбрать сервер из выпадающего списка. Войдите в систему. Во-вторых, мне нужно щелкнуть ссылку для раздела отчета. В-третьих, необходимо заполнить форму для создания отчета.

Вот что я писал до сих пор:

my $mech = WWW::Mechanize->new(); 
my $url = 'http://X.X.X.X/Console/login/login.aspx'; 

$mech->get($url); 

$mech->submit_form(
    form_number => 1, 
    fields  =>{ 
     'ctl00$ctl00$cphVeriCentre$cphLogin$txtUser' => 'someone', 
     'ctl00$ctl00$cphVeriCentre$cphLogin$txtPW' => '12345', 
     'ctl00$ctl00$cphVeriCentre$cphLogin$ddlServers' => 'Live', 
    button => 'Sign-In' 
    }, 
); 
die unless ($mech->success); 

$mech->dump_forms(); 

Я не понимаю, почему, но после этого я смотрю на то, что свалка выходы и я вижу код для первой страницы входа в систему, в то время как я верю я должен был выйти на следующую страницу после моего успешного входа в систему.

Может быть что-то с файлом cookie, который может повлиять на меня и попытку входа?

Что-нибудь еще я делаю неправильно?

Ценит ли вы помочь, Янов

ответ

2

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

Конечно, могут быть куки-файлы, которые используются. Или, может быть, вы забыли скрытый параметр формы? Только вы можете сказать.

EDIT:

  • WWW :: Mechanize должны заботиться о печенье без какого-либо дополнительного вмешательства.
  • Вы всегда должны проверить, были ли методы, которые вы назвали, были успешными. Работает ли первый get()?
  • Возможно, было бы полезно взглянуть на журналы сервера, чтобы узнать, что действительно запрашивается и какой код статуса HTTP отправлен в качестве ответа.
+0

Thanx Manni. У меня есть Firebug, но я точно не знаю, что искать. Где я могу проверить файлы cookie? Я посмотрел на все параметры, и нет никаких скрытых. – 2009-06-09 10:17:22

+0

Посмотрите на вкладку «Сеть». Он покажет все HTTP-заголовки, отправленные сервером, включая любые файлы cookie. – innaM

+0

Это то, что я получил от моего кода: GET HTTP: //XXXX/Console/login/login.aspx Accept-Encoding: GZIP, х-GZIP, выкачать User-Agent: Libwww жемчужно/5,822 (нет контента) HTTP/1.1 200 OK Cache-Control: частный Подключение: закрыть Дата: Пн, 8 июня 2009 15:08:32 GMT Сервер: Microsoft-IIS/6.0 Content-Length: 14720 Контент- Тип: text/html; charset = utf-8 Клиент-дата: пн, 08 июн 2009 15:08:32 GMT Клиент-peer: X.X.X.X: 80 Клиент-ответ-номер: 1 – 2009-06-09 11:18:12

6

Это через несколько месяцев после факта, но я решил ту же проблему, исходя из аналогичных вопросов, которые я задал. См. Is it possible to automate postback from the client side? для получения дополнительной информации.

Вместо этого я использовал механизм Python Mechanize или Perl, но применяется тот же принцип.

Подводя итоги мой предыдущий ответ:

страницы ASP.NET нужен скрытый параметр, называемый __EVENTTARGET в форме, которая не будет существовать, когда вы используете механизировать нормально.

При посещении обычного пользователя на этих страницах действует функция __doPostBack ('foo'), которая дает соответствующее значение __EVENTTARGET через событие javascript onclick на каждой из ссылок, но поскольку механизация не использует javascript вам нужно будет установить эти значения самостоятельно.

Решение для python находится ниже, но не должно быть слишком сложно адаптировать его к perl.

def add_event_target(form, target): 
    #Creates a new __EVENTTARGET control and adds the value specified 
    #.NET doesn't generate this in mechanize for some reason -- suspect maybe is 
    #normally generated by javascript or some useragent thing? 
    form.new_control('hidden','__EVENTTARGET',attrs = dict(name='__EVENTTARGET')) 
    form.set_all_readonly(False) 
    form["__EVENTTARGET"] = target 
+0

Я пробовал это, но для моей проблемы он по-прежнему не работает. Firebug показал, что еще один параметр (__EVENTARGUMENT) также передан. Я добавил и то, и __EVENTTARGET, но они, кажется, игнорируются. Я всегда получаю одинаковые результаты (мне нужны эти для пейджинга - доступ к последующим страницам). –

+0

@ HD: Вы дошли до своей страницы с помощью отправки формы? (Например, функция «Поиск в виджетах», которая дала вам вычисленный список результатов). Если вы попали на страницу с использованием формы, это может быть намного сложнее, так как вам тоже придется справляться с длинным __VIEWSTATE. Если бы вы могли отправить ссылку, я мог бы взглянуть на нее – anschauung

+0

@HD: Я также нашел на некоторых сайтах, что вам нужно также очистить некоторые посторонние значения формы. Вы можете увидеть все значения полей с помощью select_form и очистить их любым способом, который ваш предпочитаемый язык использует для удаления элементов массива. (например, .pop() в python). К сожалению, пробная версия и ошибка - это единственный способ найти эти элементы. – anschauung

0

Очень короткая суть страниц ASPX это то, что они держат все местную информацию сеанса в течение нескольких переменных с префиксом «__» в общем aspxform. Обычно это форма верхнего уровня, и все элементы формы будут ее частью, но я думаю, что это может варьироваться в зависимости от реализации.

Для конкретной реализации я имел дело с мне нужно беспокоиться о 2 из этих переменных состояния, а именно:

__VIEWSTATE 
__EVENTVALIDATION. 

Ваша цель состоит в том, чтобы убедиться, что эти переменные представлены в виде вы отправляете, поскольку они могут быть частью этой основной формы aspxform, о которой я упоминал выше, и вы, вероятно, представляете другую форму, чем это.

Когда браузер загружает страницу aspx, часть javascript передает эту информацию сессии вместе с взаимодействием с сервером/клиентом asp, но, конечно же, у нас нет такой роскоши с perl mechanize, поэтому вам нужно будет вручную отправить сообщение это сами, добавив элементы в текущую форму с помощью механизации.

В случае, я просто решаемой я в основном сделал это:

my $browser = WWW::Mechanize->new(); 

# fetch the login page to get the initial session variables 
my $login_page = 'http://www.example.com/login.aspx'; 
$response = $browser->get($login_page); 

# very short way to find the fields so you can add them to your post 
$viewstate = ($browser->find_all_inputs(type => 'hidden', name => '__VIEWSTATE'))[0]->value; 
$validation = ($browser->find_all_inputs(type => 'hidden', name => '__EVENTVALIDATION'))[0]->value; 

# post back the formdata you need along with the session variables 
$browser->post($login_page, [ username => 'user', password => 'password, __VIEWSTATE => $viewstate, __EVENTVALIDATION => $validation ]); 

# finally get back the content and make sure it looks right 
print $response->content(); 
2

Если вы на Windows, используйте Fiddler, чтобы увидеть, что данные передаются при выполнении этого процесса вручную, а затем с помощью Fiddler для сравните его с данными, записанными при выполнении вашего сценария.

По моему опыту, прокси-сервер отладки, такой как Fiddler, более полезен, чем Firebug при проверке сообщений в форме.

1

Я нашел очень полезным использовать утилиту Wireshark при написании веб-автоматизации с помощью WWW::Mechanize. Это поможет вам несколькими путями:

  1. Позволяет понять, был ли ваш запрос HTTP успешным или нет.
  2. См. Причину сбоя на уровне HTTP.
  3. Отслеживайте точные данные, которые вы передаете на сервер, и посмотрите, что вы получите назад.

Просто установите фильтр HTTP для сетевого трафика и запустите свой Perl-скрипт.

Смежные вопросы