Pull to refresh

Тестирование веб-приложений при помощи mechanize

Reading time 4 min
Views 11K
По следам хабратопика о Watir, автоматизированном иструменте тестирования для web приложений на языке Ruby, решил написать небольшую статью о подобном инструменте для языка Python. Речь пойдет о замечательной библиотеке mechanize. В отличие от Watir, mechanize не заточен под какую-либ о ОС, и является надстройкой над питоновскими библиотеками urllib и urllib2.

Сама библиотека является эмулятором браузера (без поддержки яваскрипта) и позволяет решать задачи любого класса (с огладкой на «отключенный» яваскрипт), в которых необходим применение браузера. В частности, я впервые вышел на эту библиотеку, когда нужно было скачать огромное количество научных статей с одного хранилища, требующего авторизации и хранящего документы PDF так, что без помощи вспомогательных инструментов скачивать приходилось исключительно по одному документу, чем я и занимался 2 часа, пока не вспомнил о PERL'овой библиотеке WWW::Mechanize (о возможностях которой читал некоторое время назад) и не набрал в гугле запрос WWW::Mechanize python, который и привел меня на сорсфорж.

Но довольно лирики.

Начинается все с установки библиотеки. Подробно прочитать об этом лучше всего на оффсайте в разделе скачивания. Если кратко, то есть 3 основных пути получения этой библиотеки:


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

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

  1. # -*- coding: utf-8 -*-
  2.  
  3. import re
  4. from mechanize import Browser
  5.  
  6. # определим все, что нам может пригодится дальше
  7. root_url = 'http://habrahabr.ru/'
  8. login_url = 'http://habrahabr.ru/login/'
  9. username = 'krig'
  10. userpass = '******'
  11.  
  12. comments_re = r'habrahabr\.ru/blog.*/#comments'
  13. count_re = re.compile('(\d+)\s*\+(\d+)')
  14. post_id_re = re.compile('habrahabr\.ru/blog.*/(\d+)/#comments')
  15.  
  16. def is_logged_in(page_text):
  17.     return not login_url in page_text
  18.  
  19. br = Browser()
  20.  
  21. home_page = br.open(root_url)
  22. print 'Добро пожаловать на', br.title()
  23.  
  24. # проверим залогинены ли мы и попробуем это сделать, если еще нет
  25. if not is_logged_in(home_page.read()):
  26.     print "Пробуем залогиниться"
  27.     br.follow_link(text='войти')
  28.     br.select_form(name="login")
  29.     br["login"] = username
  30.     br["password"] = userpass
  31.     result_page = br.submit()
  32.     if not is_logged_in(result_page.read()):
  33.         print "Не удалось залогиниться"
  34.         exit(1)
  35.     else:
  36.         print "Успешно вошли как", username
  37.  
  38. # посчитаем самое большое количество комментариев на главной странице
  39. max = zero_comments = 0
  40. title = url = ''
  41. print "Начинаем перебор статей на главной"
  42. br.open(root_url)
  43. # при входе на страницу сохраняем все нужные ссылки в список, чтобы не потерять его
  44. # иначе, если в нутри цикла мы перейдем на другую страницу, то br.links(...) будет возвращать
  45. # ссылки с новой страницы
  46. for comments_url in [url for url in br.links(url_regex=comments_re)]:
  47.     m = count_re.search(comments_url.text)
  48.     # если хабракаментов нет, то и совпадений нет
  49.     if not m:
  50.         zero_comments += 1
  51.     else:
  52.         if int(m.group(1)) > max:
  53.             max = int(m.group(1))
  54.             habrapost_id = post_id_re.search(comments_url.absolute_url).group(1)
  55.             post_url = [url for url in
  56.                     br.links(url_regex=r'habrahabr\.ru/blog.*/' + habrapost_id + '/?$')][0]
  57.             title = post_url.text
  58.             url = post_url.absolute_url
  59.  
  60. print 'Хабратопиков без хабракаментов:', zero_comments
  61. print 'Максимальное количество хабракаментов:', max
  62. if max:
  63.     print 'Самый коммментируемый топик:', title
  64.     print 'А находится он по адресу:', url

Исходный код

Запускаем скрипт и получаем на выходе что-то вроде:
$ python habratest.py 
Добро пожаловать на Хабрахабр
Пробуем залогиниться
Успешно вошли как krig
Начинаем перебор статей на главной
Хабратопиков без хабракаментов: 0
Максимальное количество хабракаментов: 72
Самый коммментируемый топик: Бесплатные компьютеры
А находится он по адресу: http://habrahabr.ru/blogs/startup_ideas/52540/


Другие, не менее интересные возможности этой замечательной библитеки вы можете посмотреть на ее оффсайте.
Tags:
Hubs:
+39
Comments 18
Comments Comments 18

Articles