【问题标题】:How to detect POST after form submit in Selenium python?在 Selenium python 中提交表单后如何检测 POST?
【发布时间】:2014-06-17 07:19:27
【问题描述】:

我正在使用 Selenium(python 绑定,与 Django)进行自动化 Web 应用程序测试。我的页面有一个带有按钮的表单,并且该按钮有一个捕获点击的.click() 处理程序(即不会立即提交表单)。处理程序运行function2(),当function2() 完成时,它提交表单。

在我使用 Selenium 进行的测试中,我填写了表格,然后单击提交按钮。我想验证表单是否最终提交(导致 POST 请求)。表单 POST 然后使用 GET 重定向到相同的 url,所以我无法检查新的 url。我想我需要检查 POST 请求是否发生。如何检查表单提交是否成功?

或者,我可以在数据库级别检查是否创建了一些新对象,但这会导致“单元”测试不好。

【问题讨论】:

  • 您的帖子是否改变了您所在网页上的任何内容?或者在另一个页面上你可以切换到?如果没有,您可能无法做到。您无法使用 webdriver 检查状态代码。也许只是使用检查正确状态代码的单元测试。
  • 发布不会改变当前页面上的任何内容。帖子的结果都在服务器端(除了 post->redirect->get,它在用户看来就像刷新页面一样)。我知道 django 测试客户端可以处理状态码部分,甚至可以告诉我请求方法,但我真正要测试的是 js 执行,所以我需要 selenium。
  • @andy 我不清楚您希望通过测试检查什么。您只想测试 POST 的发生,但您不在乎服务器端发生了什么?因此,如果 POST 发生但在服务器端创建了一个带有错误数据的对象,您不关心这个吗? (从客户端来看,POST 看起来仍然是成功的。)
  • @Louis 我想分别测试这些东西 - 1) POST 数据导致在 db 中创建新对象和 2) POST 发生。想象一下我的代码中有一个错误会导致我的 function2() 运行,但之后不提交表单。我有这样的错误。所以我想测试以单击按钮开始并(可能)以 http POST 作为一个单元结束的 javascript,与服务器端处理分开

标签: python django forms selenium


【解决方案1】:

好的,所以您的测试套件需要检查用户看不到的内容。以下是我想到的一些方法。

让您的服务器记录数据

使用将记录对其发出的 POST 请求的服务器,并记录此类 POST,以便测试代码可以检查 POST 是否已执行。

这是我用于我的一个应用程序的方法。我基于 Node.js 的 Express 框架创建了一个非常小而愚蠢的服务器。它只记录 POST 请求。

小而笨的服务器可能并非在所有情况下都可以正常工作。如果我必须用我实际的 Django 代码库来做这件事,这就是我要做的。我已经在我的全局项目设置中使用了一个名为 TESTING 的变量,当代码由测试套件运行时,这是正确的。当TESTING 为真时,我会这样做,以便应该接收 POST 的视图在我的测试框架可以检查它的地方记录他们收到的内容。 (它可能是一个文件。)

让您的客户记录数据

修改您的 JavaScript 代码以记录其发出的 POST。然后您可以使用driver.execute_script 来检索此信息并检查您的代码是否正确运行时您希望找到的内容。通常,我会这样做,以便仅在测试代码时才进行这种记录。生产中不会发生这样的录制。

制作代理记录数据

让 Selenium 启动的浏览器通过代理连接,该代理可以记录交互并将它们保存到文件中。然后测试套件可以检查记录的内容。这样做的好处是不需要对应用程序的代码库进行任何更改。如果您决定采用这种方式,我可以推荐的唯一工具是mitmproxy。我使用它来记录与 Zotero 服务器的交互非常成功,以避免每次运行我的测试套件时都碰到它。

【讨论】:

    【解决方案2】:

    我想这取决于你想去兔子洞的深度。

    如果您从用户的角度构建功能方面的测试,并且您的 GET 操作导致网页发生更改,则使用 selenium 触发提交,然后等待更改传播到网页(例如等待一个/多个元素改变值或等待一个元素出现)

    如果你想构建一个单元测试,那么你应该测试的只是提交数据的能力,而不是 JavaScript 代码执行 POST 请求,然后是 GET 然后显示数据的能力。

    如果您要构建集成测试,则需要检查您描述的序列中的每个单独操作是否在您认为合适的任何场景中正确执行,然后检查这些操作的总结果是否符合预期。棘手的部分是将所有这些检查链接在一起。

    如果您想构建端到端测试,那么您需要检查以上所有内容,以及对您测试的代码更改的任何永久存储位置的更改(如数据库或内存结构)以及任何压力/security/usability/performance 检查您的软件需要在您的特定上下文中传递。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多