我在一家小型软件公司担任UI测试员。为了让我的生活更轻松,我正在尝试用Python编写一个刮刀,它将自动生成在每个页面上运行的一些标准测试。测试是在使用Quicktest Pro中完成的,需要用VBScript编写。每个创建数据的页面都需要有一个完整的大小写,页面上的每个字段都会被填写,还有一些简化的大小写,其中只填写必填字段。
完整的案例应该很简单 - 我计划设置一个带有已经过身份验证的cookie的requests.Session对象,向相应的页面发送GET请求,并使用BeautifulSoup解析响应。
减少的案例我不太清楚如何接近。我可以想到三种方法,但没有一种听起来很棒:
A)尝试提交空白页面。检查表单“* <field>
是必填字段”的错误消息的响应。查找名称最接近指定字段的字段。把它们填满。尝试再次提交,然后重复,添加字段直到成功完成,并返回字段列表。
这不是很好,因为很难确定错误消息对应的字段。声明“*需要出生日期”的消息实际上可能是指HTML ID为“dob_entry1”的表单元素。我也在测试源的开发副本,因此部分填写的表单导致服务器错误并不罕见,我可能需要手动清理此方法创建的任何数据。
B)以完全填写的形式发送。找到刚刚创建的数据库记录,找出哪些列是NOT NULL。将列名称与字段名称匹配,并返回结果列表。
这似乎更有希望,但我不知道如何去寻找创建的记录。 MySQL服务器没有打开日志(错误除外),服务器上有大约15个数据库,所有这些数据库都由开发人员处理,所以我不能搞乱服务器的全局变量来打开它。我可以在数据库中查询我刚刚传入的所有值,但是数据库上已有相当多的数据,所以我不太可能确定出生日期是哪个我刚才提交的一个。
谷歌搜索,这样的工具http://hackmysql.com/mysqlsniffer可能是一个选项,但我担心整个服务器做任何事情,因为开发人员将同时在服务器上使用其他dbs。我对SQL没有太多经验,所以我不太清楚如何去做。
C)以某种方式解析C#源代码以找到对应于给定页面的查询。找出它影响的列,查询数据库以找出哪些是非NULL,将列名与字段名匹配并返回列表。
我没有使用C#的经验,所以我不知道这是多么可行,但如果它是PHP,我认为它会非常简单。如果我四处寻找,我可以找到该网站的来源,但我还没有看过任何一个。该网站已有10年历史,而且非常庞大,因此将页面名称与源文件相匹配可能并非易事。
我想像找出一个表单需要提交一个页面对于刮刀来说是一个非常常见的任务,但谷歌并没有出现太多。这些方法中的任何一种都合理吗是否有一个我错过的简单解决方案?
答案 0 :(得分:1)
我认为您的第一选择 - 从HTML回复中找出所需的字段 - 是您最安全的选择。尝试将字段名称与数据库列名称匹配可能是一个真正的问题 - 您不知道数据在保存到数据库之前经过了多少层 - 字段名称看起来与列名称完全不同。
查看是否需要某个字段不应该太难 - 从一个完整的表单开始并提交它以确定它是合法的。然后再次发送表单,没有第一个字段。如果您收到错误 - 该字段是必填字段。再次填充第一个字段,清除第二个字段并再试一次。对表单中的每个字段执行此操作。
Web应用程序需要足够稳定才能实现。您应该能够区分丢失的字段错误和服务器错误。
哦,请查看@Ming Slogar的评论 - 如果HTML人员在HTML中标记了这些字段,那么您将有很多空闲时间。