Python: urllib/urllib2 / httplib путаница
Я пытаюсь проверить функциональность веб-приложения, написав последовательность входа в систему на Python, но у меня возникли некоторые проблемы.
вот что мне нужно сделать:
- сделайте сообщение с несколькими параметрами и заголовками.
- выполните перенаправление
- получить тело HTML.
теперь я относительно новичок в python, но две вещи, которые я тестировал до сих пор, не сработали. Сначала я использовал httplib, с putrequest () (передавая параметры в URL-адресе) и putheader(). Это, казалось, не следует за перенаправлениями.
затем я попробовал urllib и urllib2, передавая как заголовки, так и параметры как дикты. Это, кажется, возвращает страницу входа, а не страницу, на которую я пытаюсь войти, я думаю, это из-за отсутствия куки или чего-то еще.
я упускаю что-то простое?
спасибо.
8 ответов:
фокус на
urllib2для этого, он довольно хорошо работает. Не связывайся сhttplib, это не API верхнего уровня.то, что вы отмечаете, это
urllib2Не следует перенаправление.вам нужно сложить в экземпляре
HTTPRedirectHandlerчто будет ловить и следовать перенаправляет.кроме того, вы можете подкласс по умолчанию
HTTPRedirectHandlerчтобы захватить информацию, которую вы затем проверите в рамках вашего модульного тестирования.cookie_handler= urllib2.HTTPCookieProcessor( self.cookies ) redirect_handler= HTTPRedirectHandler() opener = urllib2.build_opener(redirect_handler,cookie_handler)затем вы можете использовать это
openerобъект для публикации и получения, обработки перенаправлений и куки-файлов должным образом.вы можете добавить свой собственный подкласс
HTTPHandlerдля захвата и журналов различных кодов ошибок, также.
вот мой взгляд на этот вопрос.
#!/usr/bin/env python import urllib import urllib2 class HttpBot: """an HttpBot represents one browser session, with cookies.""" def __init__(self): cookie_handler= urllib2.HTTPCookieProcessor() redirect_handler= urllib2.HTTPRedirectHandler() self._opener = urllib2.build_opener(redirect_handler, cookie_handler) def GET(self, url): return self._opener.open(url).read() def POST(self, url, parameters): return self._opener.open(url, urllib.urlencode(parameters)).read() if __name__ == "__main__": bot = HttpBot() ignored_html = bot.POST('https://example.com/authenticator', {'passwd':'foo'}) print bot.GET('https://example.com/interesting/content') ignored_html = bot.POST('https://example.com/deauthenticator',{})
@S. Lott, спасибо. Ваше предложение сработало для меня, с некоторыми изменениями. Вот как я это сделал.
data = urllib.urlencode(params) url = host+page request = urllib2.Request(url, data, headers) response = urllib2.urlopen(request) cookies = CookieJar() cookies.extract_cookies(response,request) cookie_handler= urllib2.HTTPCookieProcessor( cookies ) redirect_handler= HTTPRedirectHandler() opener = urllib2.build_opener(redirect_handler,cookie_handler) response = opener.open(request)
Я должен был сделать это точно сам недавно. Мне нужны были только классы из стандартной библиотеки. Вот отрывок из моего кода:
from urllib import urlencode from urllib2 import urlopen, Request # encode my POST parameters for the login page login_qs = urlencode( [("username",USERNAME), ("password",PASSWORD)] ) # extract my session id by loading a page from the site set_cookie = urlopen(URL_BASE).headers.getheader("Set-Cookie") sess_id = set_cookie[set_cookie.index("=")+1:set_cookie.index(";")] # construct headers dictionary using the session id headers = {"Cookie": "session_id="+sess_id} # perform login and make sure it worked if "Announcements:" not in urlopen(Request(URL_BASE+"login",headers=headers), login_qs).read(): print "Didn't log in properly" exit(1) # here's the function I used after this for loading pages def download(page=""): return urlopen(Request(URL_BASE+page, headers=headers)).read() # for example: print download(URL_BASE + "config")
Я бы дал механизировать (http://wwwsearch.sourceforge.net/mechanize/) выстрел. Он вполне может обрабатывать ваши файлы cookie/заголовки прозрачно.
попробовать твил - простой язык, который позволяет пользователям просматривать веб-страницы с интерфейсом командной строки. С помощью twill вы можете перемещаться по веб-сайтам, которые используют формы, файлы cookie и большинство стандартных веб-функций. Более того, твил написано
Pythonи python API, электронной.г:from twill import get_browser b = get_browser() b.go("http://www.python.org/") b.showforms()
помимо того, что вы можете пропустить куки, могут быть некоторые поля в форме, которые вы не отправляете на веб-сервер. Лучшим способом было бы захватить фактический пост из веб-браузера. Вы можете использовать LiveHTTPHeaders или WireShark чтобы следить за трафиком и имитировать то же самое поведение в вашем скрипте.
Funkload это отличный инструмент для тестирования веб-приложения также. Он webunit обручей, чтобы справиться с эмуляцией браузера, затем дает как функциональные, так и особенности нагрузочного тестирования на вершине.
Comments