在Vugen TruClient协议中的对象步骤中使用Javascript Regex评估JS

时间:2016-02-02 16:29:51

标签: javascript loadrunner vugen truclient

使用TruClient协议(Firefox)在Vugen中创建脚本时,我 有一个Evaluate JS on object步骤找到一个对象,用 关注object.innerHTML

Foo Bar<br />BAZ
<br />

我需要从这个文本中提取BAZ以便在其他地方使用,所以我有 以下JS代码中的代码,使用正则表达式提取它:

var regex = /Foo\s+Bar<br\s+\/>(.*)\s*<br \/>/i;  // Shows as red in the TC JS editor, but no error icon shows, so not sure what the error may be.
var matches = [];
var match;
matches = regex.exec(object.innerHTML);
match = matches[matches.length - 1];
window.alert(match);  // For debugging purposes

但是,当我运行脚本时,会因以下错误而失败:

** 6: Evaluate JavaScript var regex = /Foo\s+B... alert(match); on Foo Bar
** failed - an argument is invalid: 'Code': JavaScript exception
'TypeError: matches is null' during evaluation

我测试了这个正则表达式here,它有效 如预期的那样。

使用webtoolkit online JS tester, 我已经在代码上成功测试了以下变体,以确保它 提取我需要的东西:

var data = "Foo Bar<br />BAZ<br />";
var regex = /Foo\s+Bar<br\s+\/>(.*)\s*<br \/>/i;
var matches = [];
var match;
matches = regex.exec(data);
match = matches[matches.length - 1];
alert(match);

按预期返回BAZ

修改

我最初认为这是Vugen / TruClient特定问题。然而,在睡觉之后阅读Michael Galos&#39;回答(below),我意识到这是一个通用的Javascript问题,所以我也添加了Javascript标签。

2 个答案:

答案 0 :(得分:1)

你正在寻找的是正则表达式中的“单行”标志 遗憾的是,Javascript中不存在(regex101.com会模拟它)。

要解决此问题,您可以使用它来绕过换行符:

[\s\S]

所以在你的情况下尝试类似:

var regex = /Foo\s+Bar<br\s+\/>(.*)[\s\S]*<br \/>/i; 

答案 1 :(得分:1)

感谢Michael Galos提供part of the answer。然而, 他的回答没有解决完整的问题。

我插入调试代码将object.innerHTML写入控制台 仔细研究一下。最后,在n+1运行它之后 观察输出,我观察到页面源是:

Foo Bar<br />BAZ
<br />

但是Javascript将其捕获为:

Foo Bar<br>BAZ <br>

结果,我按如下方式修改了正则表达式:

var re = /<br\s*\/?>\s*(.*?)\s*<br\s*\/?>/i

<br />代码的正则结构从<br\s+\/>更改为<br\s*\/?>会与<br /><br>匹配。 \s*匹配0个或更多空格字符,\/?可选地匹配/字符。

在捕获组修剪任何前导空格之前添加\s*,并将?添加到捕获组的末尾,通过将其转换为非贪婪匹配来修剪任何尾随空格。

现在,这可以成功地匹配以下任何一个的任何组合 或多行,仅返回BAZ

Foo Bar<br />BAZ<br />
Foo Bar<br>BAZ<br>
Foo Bar<br />     BAZ     <br />
Foo Bar<br>     BAZ     <br>