我遇到过这样的情况:我正在测试 CRM 应用程序,当我单击帐户选项卡时,它会提取一堆信息并传递参数来填充它。
例如,存款账户之类的东西:
<div style='display:none' id='AJAXCT_3_TABTHREAD1'>
{"ID":3,"p":1,"Initial":{"D_DepositAccountList_pa5493899103423pz":{"pxResults(1)":{"AccountNumber":"54324932","pyText":""}}},"Values":{},"Pages":[],"AddRemove":[],"WatchRemoved":[],"RequestorWatchRemoved":[]}
</div>
账号将显示在用户界面上。它似乎执行了另一个 ajax 调用,无论它有多少个帐户,它都会执行相同的操作。例如:
<div style='display:none' id='AJAXCT_3_TABTHREAD1'>
{"ID":3,"p":1,"Initial":{"D_DepositAccountList_pa5493899103423pz":{"pxResults(10)":{"AccountNumber":"","pyText":""}}},"Values":{},"Pages":[],"AddRemove":[],"WatchRemoved":[],"RequestorWatchRemoved":[]}
</div>
在
pxResults(10)
上未返回结果后(第 10 个帐户,因此只有 9 个),它会移至列表中可能存在的下一组帐户。就像商业贷款账户一样。
它的主体数据中有这个,但它是一个 POST 请求
D_DepositAccountList_pa5493899103423pz.pxResults(2)
这也在每个人的相同呼吁中:
<div bSimpleLayout='true' class='flex content layout-content-mimic_a_sentence content-mimic_a_sentence margin-r-3x' ><div style='' class='content-item content-field item-1 dataValueRead flex flex-row ' STRING_TYPE='field' RESERVE_SPACE='false'><span ><a data-test-id='543543578979' href='#'onclick='pd(event);' data-ctl='Link' name='DisplayAccountNumberWithActions_D_DepositAccountList_pa5493899103423pz.pxResults(1)_1' data-click='[["runDataTransform", ["PrepareTransactionHistory", "=", "D_DepositAccountList_pa5493899103423pz.pxResults(1)",":event"]],["showHarnessWrapper",["popup","RANDOMCOMPANY-Data-Account","TransactionHistory","","","D_DepositAccountList_pa5493899103423pz.pxResults(1)","No","scrollbars=yes,resizable=1,width=,height=","",{"pyDataTransform":"SetAccountDetailsTransactions","pyDataTransformParams":{}},":event","","","","","","false"]]]' class='' >54324932</a></span></div><div id="CT" SWP=".AccountNumber" SHOW_WHEN=".AccountNumber != ''" style=' ' class='content-item content-field item-2 dataValueRead flex flex-row ' STRING_TYPE='field' RESERVE_SPACE='false'><span ><i class='icons'><img data-test-id='23034020340213' data-ctl='Icon' src='webwb/gegwegewg_1112051703.png!!.png' tabindex='0' role='link' name='DisplayAccountNumberWithActions_D_DepositAccountList_pa5493899103423pz.pxResults(1)_3' alt= '' data-click='[["runDataTransform", ["SetAccountNumberToCopy", "=", "D_DepositAccountList_pa5493899103423pz.pxResults(1)",":event"]],["runScript", ["copyToClipboard(\"#~D_DepositAccountList_pa5493899103423pz.pxResults(1).pyText~#\")"]]]' /></i></span></div></div>
它通常会执行大约 2-3 个 ajax 调用,看起来像是通过 XML 填充网站,另一个调用是传递一堆 json 格式的参数/数据,但不确定它的作用。
<span>
<span data-test-id='532535235235' data-ctl='Text'class='rightJustifyStyle'>$250,000.00</span>
</span>
也许 data-test-id 很重要?
根据帐户的不同,它似乎只执行ajax请求来填写诸如贷款帐户或商业贷款帐户之类的动态布局,然后再进行
pxResults(1)
ajax调用(如果它存在于我正在使用的测试数据中);但是,我不知道它是如何“动态”决定调用哪些的。
<div data-template-name='DynamicLayout' data-template-instance-id='532535235235' CLASS='template-root-marker'></div>
<div id="pyCustomError" style="display:none;">
<div data-template-name='pxSection' data-template-instance-id='5435453453' CLASS='template-root-marker'>
<div id='65465465462' style='display:none'></div>
这也显示在许多 ajax 请求的字符串查询中
D_DepositAccountList_pa5493899103423pz.pxResults(1)
特别是 pa5493899103423pz
,具体取决于帐户。
不确定我是否必须拥有测试数据,我知道这些数据会提前加载特定的内容并据此对其进行参数化。我只是想看看我是否可以使其更加动态,因为想象我有 1 个测试数据加载 20 个不同的帐号,但假设我现在有 30 个人.. 我认为这可以快速增加并且很难管理。
我认为这是某种形式的分页,因此帐户上的数据是以“块”的形式被请求的,通常这样做是为了限制请求的大小并防止潜在的DOS攻击,通过要求返回数百/数千个实体。
为了参数化您的请求,您需要找到获取元数据或帐户第一个块的 AJAX 请求。通常,响应应包含结果数、当前“页面”以及其他“页面”是否可用。用于模拟此情况的合适测试元素是 While Controller
关于
data-test-id
我无法说明它的用途,我的假设是它是某种形式的服务信息,可以使用Selenium或Playwright等浏览器自动化框架更轻松地对CRM进行功能自动化测试