当前位置: 首页 > 知识库问答 >
问题:

在for循环中创建JavaScript对象,并在不同的for循环中使用唯一的对象

家弘业
2023-03-14

我一直在使用JavaScript代码进行自动GUI测试。我一直在进行全面的测试,并优化了一些代码。例如,我有一个函数可以将值输入到窗口的所有字段中,该窗口大致如下所示:

最初输入函数看起来是这样的:inputrowvalues(row,field1,field2,field3,field4,field5,field6,field7);这是相当笨拙的,占用了很多空间,不如编辑函数以接受一个将字段作为属性值的对象那样整洁。现在函数看起来像这样:inputrowvalues(rowObject);其中rowObject是这样定义的:

let rowObject = 
{
    field1: someValue,
    field2: someValue,
    field3: someValue,
    field4: someValue,
    field5: someValue,
    field6: someValue,
    field7: someValue
};

在我进入测试一个特殊需求的部分之前,这一直工作得很好,该需求说明当您在窗口中输入值时,您可以关闭窗口并重新打开它,而值仍然存在。最初,我通过使用函数(createVarArray)创建一组数组来实现这一目的,其中参数1和2是随机数的最小值和最大值,参数3是要放入数组中的项目数,参数4是一个可选的参数,用于10以外的基数。

// Generate random values for fields
var
    field1 = createVarArray(1, 2, 10),
    field2 = createVarArray(0, 1, 10),
    field3 = createVarArray(0, 77777, 10, 8),
    field4 = constantValue,
    field5 = createVarArray(0, 77777, 10, 8),
    field6 = createVarArray(0, 31, 10),
    field7 = createVarArray(0, 7, 10)
;
    
// Boolean values to randomly enter optional fields
var
    field3Bool = createVarArray(0, 1, 10),
    field5Bool = createVarArray(0, 1, 10),
    field6Bool = createVarArray(0, 1, 10),
    field7Bool = createVarArray(0, 1, 10)
;

然后,我使用inputrowvalues()函数输入值,并使用fieldBool数组将一些可选字段随机留空。

for (var i = 0; i < 10; i++)
{
    if (field3Bool[i] === 0) field3[i] = "";
    if (field5Bool[i] === 0) field5[i] = "";
    
    if (field6Bool[i] === 0)
    {
        field6[i] = "";
        field7[i] = "";
    }
    else if (field6Bool[i] === 1 && field7Bool[i] === 0)
    {
        field7[i] = "";
    }
    
    // Input values into fields
    inputRowValues(i+1, field1[i], field2[i], field3[i], field4, field5[i], field6[i], field7[i]);
}

然后我必须退出for循环,通过单击“Done”按钮“Save the values”,关闭窗口,然后重新打开它。

clickDone();
clickX();
openWindow();

由于这一步,我必须验证字段值是否已正确保存在seperate for循环中。如果我想在for循环中创建一个rowobject对象,那么在下一个for循环中将无法再次访问这些值。我能想到的唯一方法就是创建10个不同的对象。

for (i = 0; i < 10; i++)
{
    // These fields end up padding numbers that are less than 5 digits long with 0s in front so I add the padding for verification.
    if (field3[i] !== "") field3[i] = math.pad(field3[i], 5);
    if (field5[i] !== "") field5[i] = math.pad(field5[i], 5);
    
    // Verify correct values are saved in all fields
    verifyAllFields(i+1, field1[i], field2[i], field3[i], field4, field5[i], field6[i], field7[i]);
}

我想不出一个有效的方法来完成这件事。我想到的每个解决方案都需要创建10个不同的筛选器对象,然后执行10个不同的输入函数和10个不同的验证函数,如果我的目的是优化代码,这似乎是在倒退。

我知道这是一个很大的代码,但希望我没有让您感到失望。

共有1个答案

饶曦之
2023-03-14

这是一个叫做状态管理的问题。有很多图书馆可以让这件事变得更简单。Redux(使用Redux工具包)和Mobx。我个人更喜欢还原的方法。

每个“行”都可以是实体适配器的一部分,易于序列化。

但它的长处和短处是,您希望有一个全局的、集中的数据源来存储和更新数据。您希望有合理的默认值(空字段、0、false等),并且希望它是可序列化的。它只有在一致的情况下才是可序列化的。如果在数据上操作的东西不负责管理它的存储(即:数据的全局存储),那么序列化就更容易了。

如果选择使用状态管理库,则希望将每一行视为一个实体。每个实体都用唯一的id(行号是有效的id)添加到实体适配器中。

您可以触发一个操作添加到它,并使用一个选择器从中提取数据。如果您想保存它,您可以将它持久化到本地存储或文件中。如果要加载它,请检查文件/本地存储并将其用作初始状态。如果不存在数据,则使用有效的“空”默认值。(例如[])

 类似资料:
  • 我对编程有点陌生,我被卡住了。假设我在一个项目中有五个不同的类:foo1、foo2、foo3、foo4和foo5,它们都做不同但相似的事情。现在假设我需要为每个对象创建一个新对象,比如:foo1 bar1=new foo1();foo2 bar2=新的foo2();foo3 bar3=新的foo3();等等当然这是可行的,但如果我能在一个for循环中实例化我需要的所有对象,或者至少把我想要创建的所

  • 问题内容: 例如; 我正在使用此类: 如果我想创建N个点(originTwo,originThree … originN); 我可以使用像这样的for循环吗? 如果它是可能的; 我如何给他们起不同的名字? 问题答案: 您可以将它们放入数组。 他们会全部使用相同的,并在这些条件下。 如果你有数组和你可以做这样的: 如果您不喜欢数组,则可以使用列表: 您将其称为

  • 我试图研究我的数据中有零值的概率,我开发了一个代码,当一列数据为零时输出另一列数据的值,这正是我所需要的。但是,对于577BY29数据流中的每一列和其他28列都要这样做是很困难的,所以我决定创建一个for循环,在我有以下内容的地方为我这样做: 您可以看到,当输出数据帧有n=29列时,代码循环正确,但对于上面指定的条件,代码循环不正确。 请帮忙,谢谢!

  • 我正在编写一个计算e^x值的方法。我在python中实现它的方式如下。 这将很好地返回e^x的值。但是,当我尝试在c#中实现相同的方法时,它没有输出与python中相同的值。以下是c#中的实现。 起初,这段代码的输出是一个无穷大符号。为了解决这个问题,我只是减少了循环运行的次数。在c#中,循环只运行10次,代码的输出非常接近于python中循环运行100次的输出。我的问题是,在不同的编程语言中,两

  • 问题内容: 我试图在for循环内发出几个服务器请求。我发现了[\这个问题,\并实施了建议的解决方案。但是,它似乎不起作用。 如果我删除了for循环并将所有xmlhttp [i]更改为xmlhttp,那么对于一个元素来说一切都很好,但是我无法发出多个请求。在此先感谢您的任何建议。 问题答案: 尝试下面的代码段 响应

  • 我需要在每个循环中生成唯一的id,而不是"城市选择" 我如何在这里生成它? 我需要一些像这样的ID: 输出: