编码 UI - C# - ExecuteScript - 计数不正确 return 值

Coded UI - C# - ExecuteScript - count does not return value correctly

我在 Coded UI 中使用 ExecuteScript 观察到一个奇怪的行为。当两个数字彼此相邻时,count 不会 return 正确的值。我不确定为什么会这样。这是代码片段:

static long nowYearQA = 2030;
static long pastYearQA = 2029;

BrowserWindow window = new BrowserWindow();
window.WaitForControlEnabled();

long countCurrentYearQA = (long)window.ExecuteScript("count = 0; if(document.body.innerHTML.toString().indexOf('" + nowYearQA.ToString().Trim() + "')  > -1){count = 1;} return count;");
long countPastYearQA = (long)window.ExecuteScript("count = 0; if(document.body.innerHTML.toString().indexOf('" + pastYearQA.ToString().Trim() + "')  > -1){count = 1;} return count;");

MessageBox.Show(countCurrentYearQA + " " + countPastYearQA);

这是用于页面验证,我在其中检查某个数字是否出现在页面的内部文本中。如果数字存在,那么它 returns 1 如果数字不存在,那么它 returns 0。ExecutionScript 代码是从以下讨论中采用的:https://forums.asp.net/t/1945825.aspx?javascript+check+if+a+string+exists+on+page

对于我测试的内部网站,如果数字之间的差异至少为 2,则计算 return 正确值,但当差异大于 2 时,return 错误。

对于我使用的测试 https://www.google.com - 对于这个站点,数字之间的差异需要为 3 才能获得正确的值。例如,如果 nowYearQA = 2030 和 pastYearQA = 2029,或 pastYearQA = 2028,则 countCurrentYearQA 得到 0 而 countPastYearQA 得到 1 - 这是不正确的结果。

当 nowYearQA = 2030 和 pastYearQA = 2027 时,countCurrentYearQA 为 0,countPastYearQA 为 0 - 这是正确的结果。

我在这里忽略了什么吗?为什么会有这种差异?我从这个 post 了解到 "ExecuteScript API does not support Int, and only supports long" - 这就是我长期以来在代码片段中转换变量的原因。

您当前方法的问题是您在整个标记源中搜索四位数字字符串,这很可能出现在某处。

我提出三项改进建议:

  1. 在 innerText 中搜索,而不是在 innerHTML 中搜索。这样,作为脚本等不可见标签一部分的数字就被排除在外了
  2. 专门针对包含年份数字的标签。检查标记以找到选择器的适当条件,例如 id 值:

    document.getElementByID('yearspan').innerText

  3. 只搜索整个单词,不使用 indexOf 功能。在此处查找有关如何完成此操作的示例: