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

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

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

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

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


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

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

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

Исходный код

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


Другие, не менее интересные возможности этой замечательной библитеки вы можете посмотреть на ее оффсайте.
Теги:pythonmechanizetestingавтоматизированное тестирование
Хабы: Python
+39
9,9k 73
Комментарии 18

Похожие публикации

Преподаватель Python / Python Developer
от 100 000 до 150 000 ₽LoftschoolМожно удаленно
Python-программист
от 80 000 до 120 000 ₽ICNXМожно удаленно
QA automation (Python)
от 120 000 до 150 000 ₽Почта БанкМожно удаленно
Python разработчик
от 80 000 ₽MircodКазань
Python разработчик
от 80 000 до 140 000 ₽AGORAМожно удаленно

Лучшие публикации за сутки