Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby: Общие вопросы > Эмуляция браузера средствами Ruby


Автор: moonshiner 12.10.2010, 19:56
Добрый день, 

В ruby новичок, но сразу же возникла задача написать скрипт, который логинился бы на определенный хост, выбирал в паре-тройке drag&drop'ов нужные поля и нажимал кнопку Apply. После чего переходил по другой ссылке на том же хосте и стягивал файл. Сколько искал примеров реализации подобной задачи ничего не нашел кроме разве что одного и того же материала касательно HTTP POST & GET. Это благо и на ruby-doc.org имеется... Может быть кто-то сталкивался с подобного рода задачей и может показать как это реализуется. 

Заранее большое спасибо.

Автор: source777 13.10.2010, 00:00
Цитата(moonshiner @  12.10.2010,  19:56 Найти цитируемый пост)
ничего не нашел кроме разве что одного и того же материала касательно HTTP POST & GET.

И что тебе ещё нужно? Любые сайты на данный момент работают только с помощью этих двух методов.
Кроме того, http://ruby-toolbox.com/categories/http_clients.html предостаточно, выбирай на вкус.

Автор: moonshiner 13.10.2010, 09:16
Спасибо за ссылки, буду изучать smile 

Автор: solenko 13.10.2010, 09:38
Цитата(moonshiner @  12.10.2010,  18:56 Найти цитируемый пост)
выбирал в паре-тройке drag&drop'ов нужные поля и нажимал кнопку Apply

selenium rc и другие тестовые фреймверки

Автор: moonshiner 14.10.2010, 19:34
Доброго времени суток, 

Подскажите пожалуйста что я делаю не так.. "код" если его можно так назвать, написал используя Guide с оф сайта Mechanize. Судя по логам приложения, скрипт только по ссылкам ходит, но выборку из drop down полей не делает :-( может есть у кого идеи? Заранее спасибо

Код

require 'rubygems'
require 'mechanize'
require 'rio'
  
agent = Mechanize.new 
agent.user_agent_alias = 'Mac Safari'

url = 'http://127.0.0.1/projects/test'
page = agent.get url

page = agent.click(page.link_with(:text => 'Issues'))

def select 
  selectlist.add_filter_select = selectlist.options.priority_id.value
  selectlist.operators_priority_id = selectlist.options.first.value
  selectlist.values_priority_id = selectlist.options.low.value
end 

page = agent.click(page.link_with(:href => /filter/))

rio('http://127.0.0.1/projects/test/issues.pdf') > rio('/home/moonshiner/issues.pdf')

# pp page


Автор: source777 15.10.2010, 19:34
Цитата(moonshiner @  14.10.2010,  19:34 Найти цитируемый пост)
но выборку из drop down полей не делает

А что должен? Это твоя работа - указать какие HTTP запросы отсылать серверу, а не полагаться на искусственный интеллект Mechanize, которого у него и не было никогда.

Автор: moonshiner 16.10.2010, 00:43
А разве нет? При нажатии на последнюю сслыку (c href /filter/) в браузере в логи пишется что мол пришел POST запрос. При выполнении скрипта такого не происходит, хотя жмакается та же самая ссылка. Я просто не пойму что я делаю не так... 

Автор: solenko 16.10.2010, 07:57
Цитата(moonshiner @  15.10.2010,  23:43 Найти цитируемый пост)
При выполнении скрипта такого не происходит, хотя жмакается та же самая ссылка.

Если при гажатии ссылки отправляется POST запрос, значит отрабатывает JS, который мечанайз выполнять не умеет.

Автор: source777 16.10.2010, 12:36
Цитата(moonshiner @  16.10.2010,  00:43 Найти цитируемый пост)
Я просто не пойму что я делаю не так...  

Ты пытаешься эмулировать действия пользователя, вместо того чтобы автоматизировать последствия этих действий. Юзер может 2 часа заполнять формы, таскать всякие js-контролы из стороны в сторону, а результатом его действий станет один единственный HTTP-запрос. А ты вместо того, чтобы просто автоматизировать нужные HTTP-запросы, пытаешься непонятно с какой целью эмулировать действия пользователя. Иногда действия пользователя эмулируют с целью интеграционного тестирования, но для решения поставленной в топике задачи - это затея совершенно неподходящая и несоразмерно сложная.
Складывается ощущение, что ты видишь сайт только с точки зрения пользователя, что крайне вредно в данном случае. Так что изучи хотя бы основы HTTP, прежде чем приступать к задачам автоматизации.

Цитата(solenko @  16.10.2010,  07:57 Найти цитируемый пост)
Если при гажатии ссылки отправляется POST запрос, значит отрабатывает JS, который мечанайз выполнять не умеет. 

Так нафига Mechanize знать про какой-то JS? Ему достаточно сделать конкретный http://mechanize.rubyforge.org/mechanize/Mechanize.html#M000238 с конкретными параметрами.

Автор: moonshiner 20.10.2010, 10:01
Доброе утро, 

А никто не сталкивался с подобного рода проблемой: 
при попытке сделать post запрос mechanize выкидывает такую ошибку:
 
Цитата

ws-moonshiner# ruby post.rb
/usr/local/lib/ruby/gems/1.8/gems/mechanize-1.0.0/lib/mechanize.rb:464:in `post_form': 500 => Net::HTTPInternalServerError (Mechanize::ResponseCodeError)
    from /usr/local/lib/ruby/gems/1.8/gems/mechanize-1.0.0/lib/mechanize.rb:357:in `post'
    from post.rb:16


сам скрипт: 

Код

require 'rubygems'
require 'mechanize'
require 'logger'

agent = Mechanize.new { |a| a.user_agent_alias = 'Mac Mozilla'}
agent.log = Logger.new(STDOUT)

page = agent.get("http://127.0.0.1/login") 
login_form = page.form_with(:action => "/login")
login_form.username = 'user'
login_form.password = 'pass'
page = agent.submit login_form
  
issues_page = agent.get("http://127.0.0.1/projects/test/issues")

agent.post(issues_page, {
  "priority_id" => "3",
  'tracker_id' => "1",
})

Автор: source777 20.10.2010, 19:46
Цитата(moonshiner @  20.10.2010,  10:01 Найти цитируемый пост)
500 => Net::HTTPInternalServerError

Сервер не может обработать запрос, скорее всего ошибка в запросе.


Цитата(moonshiner @  20.10.2010,  10:01 Найти цитируемый пост)
agent.post(issues_page, {
  "priority_id" => "3",
  'tracker_id' => "1",
})


Ты имел в виду это:
Код

agent.post("http://127.0.0.1/projects/test/issues", {
  "priority_id" => "3",
  'tracker_id' => "1",
})

?

Автор: moonshiner 28.10.2010, 09:58
День добрый! 

Как выяснилось, приложение "умеет" сохранять форму запросов (выборку drag&drop).. POST запрос не потребовался, задача решена с помощью GET. Всем большое спасибо за помощь! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)