52

Python でログイン シーケンスをスクリプト化して Web アプリの機能をテストしようとしていますが、問題が発生しています。

これが私がする必要があることです:

  1. いくつかのパラメーターとヘッダーを指定して POST を実行します。
  2. リダイレクトに従う
  3. HTML 本文を取得します。

現在、私は比較的 python に慣れていませんが、これまでにテストした 2 つのことはうまくいきませんでした。最初に httplib を使用し、putrequest() (URL 内でパラメーターを渡す) と putheader() を使用しました。これはリダイレクトに従っていないようです。

次に、urllib と urllib2 を試し、ヘッダーとパラメーターの両方を dict として渡しました。これは、ログインしようとしているページではなく、ログインページを返すようです.Cookieまたは何かが不足しているためだと思います.

簡単なものがありませんか?

ありがとう。

4

8 に答える 8

31

これに焦点を当てるとurllib2、非常にうまく機能します。をいじらないでくださいhttplib。これはトップレベルの API ではありません。

あなたが注目しているのはurllib2、リダイレクトに従っていないことです。

HTTPRedirectHandlerリダイレクトをキャッチして追跡するインスタンスを折りたたむ必要があります。

さらに、デフォルトをサブクラス化してHTTPRedirectHandler、ユニット テストの一部として確認する情報を取得することもできます。

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

その後、このopenerオブジェクトを使用して POST と GET を実行し、リダイレクトと Cookie を適切に処理できます。

の独自のサブクラスを追加して、HTTPHandlerさまざまなエラー コードをキャプチャしてログに記録することもできます。

于 2008-11-19T14:52:47.490 に答える
15

これがこの問題に関する私の見解です。

#!/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',{})
于 2011-01-29T09:33:42.020 に答える
13

@ 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)
于 2008-11-19T15:17:31.590 に答える
11

私は最近、この正確なことを自分でしなければなりませんでした。標準ライブラリのクラスだけが必要でした。これが私のコードからの抜粋です:

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")
于 2008-11-19T15:12:08.637 に答える
8

Mechanize ( http://wwwsearch.sourceforge.net/mechanize/ ) を試してみます。Cookie/ヘッダーを透過的に処理する場合があります。

于 2008-11-19T14:19:19.010 に答える
6

twillを試してみてください。これは、ユーザーがコマンドライン インターフェイスから Web を閲覧できるようにする単純な言語です。ツイルを使用すると、フォーム、Cookie、およびほとんどの標準的な Web 機能を使用する Web サイトをナビゲートできます。さらに要点を言えば、twillはpython APIで記述されPythonており、次のようになります。

from twill import get_browser
b = get_browser()

b.go("http://www.python.org/")
b.showforms()
于 2008-11-19T14:15:32.323 に答える
0

Cookie が欠落している可能性があるという事実に加えて、Web サーバーに POST していないフォームのフィールドがいくつかある可能性があります。最良の方法は、Web ブラウザーから実際の POST をキャプチャすることです。LiveHTTPHeaders またはWireSharkを使用してトラフィックをスヌープし、スクリプトで同じ動作を模倣できます。

于 2008-11-19T14:00:59.157 に答える
0

Funkloadは優れた Web アプリ テスト ツールでもあります。ブラウザのエミュレーションを処理するために webunit をラップし、その上で機能と負荷テストの両方の機能を提供します。

于 2008-11-19T14:32:49.887 に答える