根据 JavaScript Functions in Selenium IDE HTML Tests:
,这应该是可能的<tr>
<td>storeEval</td>
<td>function(input) {return input.replace('foo', 'bar');}</td>
<td>replaceText</td>
</tr>
<tr>
<td>storeEval</td>
<td>replaceText('foo')</td>
<td>var</td>
</tr>
相反,我得到以下异常:
function statement requires a name
在给它起一个名字后,语句就会运行:
<tr>
<td>storeEval</td>
<td>function replaceText(input) {return input.replace('foo', 'bar');}</td>
<td>replaceText</td>
</tr>
但下一行未能找到定义:
replaceText is not defined
我也尝试过引用变量而不是函数:
<tr>
<td>storeEval</td>
<td>${replaceText}('foo')</td>
<td>var</td>
</tr>
但显然它仍未定义:
null is not a function
我也试过制作anonymous function:
<tr>
<td>storeEval</td>
<td>(function (input) {return input.replace('foo', 'bar')})</td>
<td>replaceText</td>
</tr>
并用括号运行:
<tr>
<td>storeEval</td>
<td>(${replaceText})('foo')</td>
<td>var</td>
</tr>
错误:
missing ) in parenthetical
且没有:
<tr>
<td>storeEval</td>
<td>${replaceText}('foo')</td>
<td>var</td>
</tr>
错误:
missing ; before statement
答案 0 :(得分:3)
您需要的是self executing anonymous function:
<tr>
<td>storeEval</td>
<td>(function(input) {return input.replace(input, 'bar');})('foo')</td>
<td>replaceText</td>
</tr>
请注意,您还可以将变量用作参数:
<tr>
<td>store</td>
<td>'foo'</td>
<td>searchText</td>
</tr>
<tr>
<td>storeEval</td>
<td>(function(input) {return input.replace(input, 'bar');})(${searchText})</td>
<td>replaceText</td>
</tr>
答案 1 :(得分:1)
我在上面测试,但是在参数列表之后我收到错误“[错误]抛出异常:丢失” 所以,我将“$ {searchText}”更改为“storedVars ['searchText']”,没关系:)
ps:JavaScript可以与两种类型的Selenese参数一起使用:脚本和非脚本(通常是表达式)。在大多数情况下,您需要访问和/或操作用作Selenese参数的JavaScript代码段中的测试用例变量。在测试用例中创建的所有变量都存储在JavaScript关联数组中。关联数组具有字符串索引而不是顺序数字索引。包含测试用例变量的关联数组名为storedVars。每当您希望访问或操作JavaScript代码段中的变量时,您必须将其称为storedVars ['yourVariableName']。
http://www.seleniumhq.org/docs/02_selenium_ide.jsp#store-commands-and-selenium-variables
答案 2 :(得分:1)
Katranci的答案非常有用,但是一旦我添加for循环,变量就会失去范围。我在window.eval()中使用了Katranci的解决方案。
window.eval('(function() { var trs = document.querySelectorAll(".my-list table tbody tr"); for (var x in trs) { var trc = trs[x].childNodes; for (var y in trc) { var html = trc[y].innerHTML; if (typeof html != "undefined" && html.match(/Selenium Testing/)) { return trs[x].className.replace(" lastrow", ""); } } } } )();');
在这种情况下,我创建了以“Selenium Testing”为前缀的测试条目,并使用此代码来识别后续测试用例。这恰好是一个没有jquery的页面。
答案 3 :(得分:1)
可以定义一个函数并在其他地方重用它:
<tr>
<td>storeEval</td>
<td>(function(){return function(min,max){return Math.floor(Math.random()*(max-min)) + min;} })()</td>
<td>randomIntInRange</td>
</tr>
<tr>
<td>storeEval</td>
<td>(function(){return storedVars['randomIntInRange'](10000,99999) +'-'+ storedVars['randomIntInRange'](1000,9999) })()</td>
<td>randomZip</td>
</tr>
<tr>
<td>echo</td>
<td>${randomZip}</td>
<td></td>
</tr>
...
[info] echo: 92105-3139
这适用于Selenium IDE 2.9.0