如何在Selenium Python中检测表单提交后的POST?
我正在使用Selenium(Python的一个库,配合Django)来自动测试网页应用。我的页面上有一个表单和一个按钮,这个按钮有一个 .click()
的处理程序,用来捕捉点击事件(也就是说,表单不会立刻提交)。这个处理程序会运行 function2()
,等 function2()
完成后,再提交表单。
在我的Selenium测试中,我先填写表单,然后点击提交按钮。我想确认表单最终被提交了(这会产生一个POST请求)。表单会进行POST请求,然后用GET请求重定向到同一个网址,所以我不能通过检查网址来确认。我觉得我需要检查POST请求是否发生。那我该怎么确认表单提交成功呢?
另外,我也可以在数据库层面检查一下,看看是否创建了新的对象,但那样就不算是一个好的“单元”测试了。
2 个回答
我想这要看你想深入到什么程度。
如果你是从用户的角度来测试功能,假设你的GET操作会导致网页上的内容发生变化,那么你可以用selenium来触发提交,然后等着这些变化在网页上显示出来(比如等一个或多个元素的值改变,或者等某个元素出现)。
如果你想做单元测试,那你只需要测试提交数据的功能,不用去测试JavaScript代码是否能成功发送POST请求、再发送GET请求并显示数据。
如果你想做集成测试,那你需要检查你描述的每个步骤在你认为合适的场景中是否都正确执行,然后再检查这些步骤的最终结果是否符合预期。比较棘手的部分是把所有这些检查连接起来。
如果你想做端到端测试,那你需要检查以上所有内容,还要检查代码对任何永久存储位置的更改(比如数据库或内存结构),以及你的软件在特定情况下需要通过的压力、安全性、可用性和性能测试。
好的,你的测试套件需要检查一些用户看不到的东西。这里有一些方法可以考虑。
让你的服务器记录数据
使用一个可以记录发送给它的POST请求的服务器,这样测试代码就可以检查这些POST请求是否成功执行。
这是我在一个应用中使用过的方法。我创建了一个非常简单的服务器,基于Node.js的Express框架。这个服务器只负责记录POST请求。
这个简单的服务器可能并不适用于所有情况。如果我需要在我的Django代码中实现这个功能,我会这样做。我在全局项目设置中使用了一个名为TESTING
的变量,当代码被测试套件运行时,这个变量为真。当TESTING
为真时,我会让那些应该接收POST请求的视图记录它们收到的数据,并存放在一个我的测试框架可以检查的地方(比如一个文件)。
让你的客户端记录数据
修改你的JavaScript代码,记录它发送的POST请求。然后你可以使用driver.execute_script
来获取这些信息,并检查如果代码正常运行你应该找到的内容。一般来说,我会让这种记录只在代码被测试时进行,而在生产环境中则不进行记录。
让代理记录数据
让Selenium启动的浏览器通过一个可以记录交互并保存到文件的代理进行连接。然后测试套件可以检查记录下来的内容。这种方法的好处是你不需要对应用的代码进行任何修改。如果你决定走这条路,我推荐的唯一工具是mitmproxy。我用它成功地记录了与Zotero服务器的交互,这样每次运行测试套件时就不需要再访问服务器了。