6

根据Selenium IDE HTML 测试中的 JavaScript 函数,这应该是可能的:

<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

我还尝试制作一个匿名函数

<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

4 回答 4

3

你需要的是一个自我执行的匿名函数

<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>
于 2013-05-04T08:12:41.310 回答
1

我在上面进行了测试,但出现错误“[error] Thew an exception: missing ) after argument list”所以,我将“${searchText}”更改为“storedVars['searchText']”,没关系:)

ps:JavaScript 可以与两种类型的 Selenese 参数一起使用:脚本和非脚本(通常是表达式)。在大多数情况下,您需要访问和/或操作 JavaScript 片段中用作 Selenese 参数的测试用例变量。在测试用例中创建的所有变量都存储在 JavaScript 关联数组中。关联数组具有字符串索引而不是顺序数字索引。包含测试用例变量的关联数组被命名为 storedVars。每当您希望访问或操作 JavaScript 片段中的变量时,您必须将其称为 storedVars['yourVariableName']。

http://www.seleniumhq.org/docs/02_selenium_ide.jsp#store-commands-and-selenium-variables

于 2013-11-24T09:08:09.920 回答
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 测试”为前缀的测试条目,并使用此代码来识别后续测试用例的条目。这恰好是一个没有 jquery 的页面。

于 2014-09-17T18:47:13.753 回答
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

于 2015-05-29T12:47:09.867 回答