javascript - 添加到 JS 脚本中时,iMacros 脚本无法正确循环

标签 javascript loops firefox-addon imacros

我有一个 iMacros 脚本,在单独运行时可以正确循环 - 读取输入表的所有行 - 但当包含在我的 JS 脚本中时根本不会循环。

这是当我设置“重复宏”“最大:”变量时独立工作的 iMacros 脚本

VERSION BUILD=8881205 RECORDER=FX
TAB T=1
SET !DATASOURCE Org_Acc_DK.csv
SET !DATASOURCE_COLUMNS 4
SET !LOOP 2
SET !DATASOURCE_LINE {{!LOOP}}
URL GOTO=http://SOME SITE HERE (replaced the name to protect the guilty)
WAIT Seconds=3
TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:form1 ATTR=ID:MainContent_btnNewAcct
TAG POS=1 TYPE=SELECT FORM=ID:form1 ATTR=ID:MainContent_ucAddOrganisationAccount_ddOrgList CONTENT={{!COL1}}
WAIT Seconds=3
TAG POS=1 TYPE=INPUT:TEXT FORM=ID:form1 ATTR=ID:MainContent_ucAddOrganisationAccount_txtOAAccount CONTENT={{!COL2}}
TAG POS=1 TYPE=SELECT FORM=ID:form1 ATTR=ID:MainContent_ucAddOrganisationAccount_ddlOACountry CONTENT=$*{{!COL3}}*
WAIT Seconds=5
TAG POS=1 TYPE=SELECT FORM=ID:form1 ATTR=ID:MainContent_ucAddOrganisationAccount_ddOALessor CONTENT=$*{{!COL4}}*
TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:form1 ATTR=ID:btnOASave
WAIT Seconds=3

当我将该脚本添加到以下 JS 脚本中时 - 它仅运行一次,然后返回到 JS 脚本并完成。 现在我意识到这是因为我没有将“重复宏”设置为行数。但是我需要在 JAVA 脚本中添加什么才能仅设置此特定脚本的重复行而不是其之前或之后的重复行?

var i, retcode;
var report;
var macrolist = new Array();


macrolist.push("Create Account/0 Login");
macrolist.push("Create Account/01 Create Organisation And Account.iim");
macrolist.push("Create Account - DK Loop.iim");



iimDisplay("Start Self Test");

report  =  "Self-Test Report\n\n";

for (i = 0; i < macrolist.length; i++) {
iimDisplay("Step "+(i+1)+" of "+macrolist.length + "\nMacro: "+macrolist[i]);
retcode = iimPlay(macrolist[i]);
report += macrolist[i];
if (retcode < 0) {
    report += ": "+iimGetLastError();
} else {
    report += ": OK";

    s = iimGetLastExtract(1);
    if ( s != "" )  report += ", Extract: "+s;
}
report += "\n";
}
iimDisplay("Test complete");

alert ( report );

提前致谢, 道格

最佳答案

我的一位非常乐于助人的 friend 开发了一个 Java 脚本来完全满足我的需要。对 CSV 文件获取数据的外部调用将循环遍历工作表,直到使用此脚本找到最后一条记录。

这太好了,我觉得有必要与其他可能会遇到与我类似情况的人分享。

您真正需要对 iMacros 脚本进行的唯一更改是将“POSVAL”添加到“SET !LOOP”命令,如下所示:

SET !LOOP {{POSVAL}} 

首先,需要表达所有引用的数据源并确定它们正在被哪个宏使用。

var i, retcode, report;
var macro2_file="Org_Acc_info.csv";
var macro3_file="Testfile1.csv";
var macro4_file="Testfile2.csv";
var macro5_file="Details_Tab.csv";

在运行循环脚本之前运行单个登录脚本。

retcode = iimPlay("Create Account/0 Login");
report = "";
if (retcode < 0) report += ": "+iimGetLastError();

然后是循环例程的 header 引用代码

var lines_in_file;

然后是我想要从 Macro2 开始循环的各个文件

 lines_in_file = count_rows(get_data_folder()+"\\", macro2_file);

for (i=2; i<=lines_in_file ; i++)
{
  retcode = iimSet("POSVAL",  i);
  retcode = iimPlay("Create Account/01 Create Organisation And Account.iim");
  if (retcode < 0) report += ": "+iimGetLastError();
}

然后是宏3

lines_in_file = count_rows(get_data_folder()+"\\", macro3_file);

for (i=2; i<=lines_in_file ; i++)
{
  retcode = iimSet("POSVAL",  i);
  retcode = iimPlay("Create Account - DK Loop - VBS.iim");
  if (retcode < 0) report += ": "+iimGetLastError();
}

然后是宏4

lines_in_file = count_rows(get_data_folder()+"\\", macro4_file);

for (i=2; i<=lines_in_file ; i++)
{
  retcode = iimSet("POSVAL",  i);
  retcode = iimPlay("Create Account/2 Create Account Address.iim");
  if (retcode < 0) report += ": "+iimGetLastError();
}

然后是宏5

lines_in_file = count_rows(get_data_folder()+"\\", macro5_file);

for (i=2; i<=lines_in_file ; i++)
{
  retcode = iimSet("POSVAL",  i);
  retcode = iimPlay("Create Account/4 Edit Account Details.iim");
  if (retcode < 0) report += ": "+iimGetLastError();
}

然后是循环代码主体

function get_data_folder()
{
  var code;
  code =  "CODE:";
  code +=  "SET !extract {{!FOLDER_DATASOURCE}}" + "\n";
  iimPlay(code);
  return iimGetLastExtract(0);
}


function count_rows(datasource,csv_file_name)
{
  // COUNT THE NUMBERS OF NON-BLANK ROWS IN CSV FOR LOOP
  const CRLF = "\r\n";
  const LF = "\n";

  var lines = new Array();

  var file_i = imns.FIO.openNode(datasource+csv_file_name);
  var text = imns.FIO.readTextFile(file_i); // Read file into one string

  // Determine end-of-line marker
  var eol = (text.indexOf(CRLF) == -1) ? LF : CRLF;

  // Split into lines (number of lines) NUMBER OF LINES IN CSV
  lines = text.split(eol);
  var count=0;
  for(var i=0;i< lines.length; i++){
    if (lines[i]!="") count++;
  }
// FINISH COUNTING count= NUmber of LInes
return count;
}

关于javascript - 添加到 JS 脚本中时,iMacros 脚本无法正确循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28554268/

相关文章:

javascript - 为什么我的 Firefox 插件无法执行请求

javascript - jQuery - 从索引中获取子项作为 jQuery 对象

javascript - 从 Javascript 设置一个 PHP 变量并从 &lt;style&gt; 读入

loops - 升压: Just iterate over elements of a ptree

loops - ansible 遍历文件列表并检查文件是否存在,如果不存在则下载

javascript - 自上次用户在 Firefox 中事件以来的时间

javascript - 使用新的 retrieveMultipleRecords 从 fetchXml 获取结果(客户端 API 引用)

javascript - 如何根据第一个下拉列表值使第二个下拉列表自动选择值

delphi - 如何将子树从一个 TTreeView 复制到另一个 TTreeView?

javascript - innerHTML : How To Avoid