如何在Selenium IDE中创建自定义函数?

时间:2013-01-17 10:52:07

标签: javascript selenium-ide

根据 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

4 个答案:

答案 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