在FunkLoad中测试表单提交

0 投票
1 回答
1459 浏览
提问于 2025-04-17 04:51

我正在尝试使用FunkLoad来测试一个网页应用的功能。

我测试的页面只是一个登录表单——输入邮箱和密码,如果成功就会跳转到首页;如果不成功就会显示错误信息。

我有以下代码:

self.get(server_url + "/login", description="Get /init/default/login")
params=[['email', 'xxxx@gmail.com'],
        ['password', 'xxxxx'],
        ['_formname','login'],
        ]
ret=self.post('%s/login' % server_url,
          params=params,
          description="Testing login functionality")

self.logd(self.getBody())

无论输入的是有效的邮箱和密码,还是错误的,测试都会返回一个200的状态码,并且停留在同一个登录页面。

我该如何使用FunkLoad来测试表单提交呢?

(顺便说一下,当我用mechanize脚本测试这个网页时,我能够成功登录并跳转到正确的首页)

谢谢!

1 个回答

2

首先,按照funkload的文档设置好funkload代理录制器,并用你的浏览器登录到你的网站,具体步骤可以参考这个链接:http://funkload.nuxeo.org/recorder.html

这样你就可以很方便地查看你通过POST请求发送了什么数据。你可能会发现自己发送的参数和想象中的不一样。在下面的例子中,我在测试一个使用了crsfmiddleware的django登录功能,这个功能还包含一个redirect_to参数,这样服务器就知道如果登录成功后应该重定向到哪里。这个测试其实并没有真正“使用”表单,它只是模拟了浏览器在有人填写表单时会发送的数据。如果你想测试表单的真实功能,最好的办法是使用像selenium这样的工具。

我需要手动提取crsftoken,因为它在每次请求时都会变化,并且添加了一个断言来检查是否没有返回到登录页面。除此之外,这个测试和录制器自动生成的测试是一样的:

def test_LoginTest(self):
    # The description should be set in the configuration file
    server_url = self.server_url
    # begin of test ---------------------------------------------

    # /tmp/tmpMFahey_funkload/watch0001.request
    self.get(server_url + "/",
        description="Get /")
    # /tmp/tmpMFahey_funkload/watch0002.request
    reply = self.get(server_url + "/company/config/dashboard/",
        description="Get /company/config/dashboard/")

    csrftoken = extract_token(self.getBody(), "name='csrfmiddlewaretoken' value='", "' />")
    # /tmp/tmpMFahey_funkload/watch0005.request
    self.post(server_url + "/accounts/manager/login/?next=/company/config/dashboard/", params=[
        ['csrfmiddlewaretoken', csrftoken],
        ['redirect_to', '/company/config/dashboard/'],
        ['email', 'user'],
        ['password', '****']],
        description="Post /accounts/manager/login/")

    self.assert_("login" not in self.getLastUrl(), "Error in login")

    # /tmp/tmpMFahey_funkload/watch0008.request
    self.get(server_url + "/accounts/manager/logout/",
        description="Get /accounts/manager/logout/")

这个测试适用于以下表单:

<form method="post" action="">
<input type='hidden' name='csrfmiddlewaretoken' value='bb7d67ced4a2c6ee44eba811d44c936d' />
<input type="hidden" name="redirect_to" value="/company/config/dashboard/" id="id_redirect_to" />
<input id="id_email" type="text" class="formtxt fom_size1" name="email" maxlength="100" />
<input id="id_password" type="password" class="formtxt fom_size1" name="password" />
<button class="formbtn" type="submit">Validate</button>

撰写回答