2008-11-19 8 views
52

Tôi đang cố gắng kiểm tra chức năng của một ứng dụng web bằng cách viết một chuỗi đăng nhập bằng Python, nhưng tôi đang gặp một số rắc rối.Python: urllib/urllib2/httplib nhầm lẫn

Đây là những gì tôi cần phải làm:

  1. Thực hiện POST với một vài thông số và tiêu đề.
  2. Làm theo chuyển hướng
  3. Truy xuất nội dung HTML.

Bây giờ, tôi tương đối mới với python, nhưng hai điều tôi đã thử nghiệm cho đến nay vẫn chưa hiệu quả. Đầu tiên tôi sử dụng httplib, với putrequest() (chuyển các tham số bên trong URL), và putheader(). Điều này dường như không theo các chuyển hướng.

Sau đó, tôi đã thử urllib và urllib2, chuyển cả tiêu đề và tham số dưới dạng dicts. Điều này dường như trả lại trang đăng nhập, thay vì trang tôi đang cố đăng nhập, tôi đoán đó là do thiếu cookie hoặc thứ gì đó.

Tôi có thiếu thứ gì đó đơn giản không?

Cảm ơn.

+1

Sử dụng thư viện yêu cầu python. – hughdbrown

Trả lời

31

Tập trung vào urllib2 cho điều này, nó hoạt động khá tốt. Đừng gây rối với httplib, đó không phải là API cấp cao nhất.

Điều bạn đang lưu ý là urllib2 không thực hiện theo chuyển hướng.

Bạn cần gấp trong phiên bản HTTPRedirectHandler sẽ bắt và theo dõi chuyển hướng.

Hơn nữa, bạn có thể muốn phân lớp mặc định HTTPRedirectHandler để nắm bắt thông tin mà sau đó bạn sẽ kiểm tra như một phần của thử nghiệm đơn vị của mình.

cookie_handler= urllib2.HTTPCookieProcessor(self.cookies) 
redirect_handler= HTTPRedirectHandler() 
opener = urllib2.build_opener(redirect_handler,cookie_handler) 

Sau đó, bạn có thể sử dụng đối tượng opener này để POST và GET, xử lý chuyển hướng và cookie đúng cách.

Bạn có thể muốn thêm lớp con của riêng mình là HTTPHandler để chụp và ghi lại nhiều mã lỗi khác nhau.

+12

urllib2.urlopen dường như xử lý chuyển hướng tốt. –

+0

@Sridhar Tôi đã tìm thấy rằng quá - urllib2.urlopen sau chuyển hướng hoàn hảo. – mikemaccana

0

Bên cạnh thực tế là bạn có thể thiếu cookie, có thể có một số trường trong biểu mẫu mà bạn không đăng lên máy chủ web. Cách tốt nhất là nắm bắt POST thực tế từ trình duyệt web. Bạn có thể sử dụng LiveHTTPHeaders hoặc WireShark để thu hút lưu lượng truy cập và bắt chước hành vi tương tự trong tập lệnh của bạn.

+0

Cảm ơn bạn đã có một mẹo addon Firefox tốt :) Nhưng không, dường như tôi đang chuyển các tiêu đề và dữ liệu cần thiết. – Ace

6

Hãy thử twill - một ngôn ngữ đơn giản cho phép người dùng duyệt Web từ giao diện dòng lệnh. Với tính năng twill, bạn có thể điều hướng thông qua các trang web sử dụng biểu mẫu, cookie và hầu hết các tính năng web chuẩn. Thêm vào điểm, twill được viết bằng Python và có một python API, ví dụ:

from twill import get_browser 
b = get_browser() 

b.go("http://www.python.org/") 
b.showforms() 
0

Funkload cũng là một công cụ kiểm tra ứng dụng web tuyệt vời. Nó kết thúc tốt đẹp webunit để xử lý giả lập trình duyệt, sau đó cung cấp cho bạn cả tính năng thử nghiệm chức năng và tải trên đầu trang.

11

Tôi phải tự làm điều này một cách chính xác gần đây. Tôi chỉ cần các lớp học từ thư viện chuẩn. Đây là đoạn trích từ mã của tôi:

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") 
13

@ S.Lott, cảm ơn. Đề xuất của bạn làm việc cho tôi, với một số sửa đổi. Đây là cách tôi đã làm nó.

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) 
15

Đây là vấn đề của tôi về vấn đề này.

#!/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',{}) 
+0

Đây là câu trả lời duy nhất thực sự làm cho quá trình này trở nên đơn giản. – EMI