使用带有随机值的 Selenium IDE
-
03-07-2019 - |
题
是否可以使用 Firefox 插件创建 Selenium 测试,并使用随机生成的值来帮助进行回归测试?
完整的故事:我想帮助我的客户进行验收测试,为他们提供一套测试,使用一些智能方法为数据库创建随机(或至少伪随机)值。目前我的 Selenium IDE 测试的问题之一是它们具有预定义的值 - 这使得某些类型的测试出现问题。
解决方案
首先,Selenium IDE相当有限,您应该考虑切换到Selenium RC,它可以由Java或Perl或Ruby或其他语言驱动。
只使用Selenium IDE,您可以嵌入JavaScript表达式来派生命令参数。 您应该能够在文本字段中键入随机数,例如:
type fieldName javascript{Math.floor(Math.random()*11)}
更新:您可以在名为<!>“; user-extensions.js <!>”的文件中定义辅助函数。请参阅 Selenium Reference 。
其他提示
(基于Thilo回答) 你可以像这样混合文字和随机数:
javascript{"joe+" + Math.floor(Math.random()*11111) + "@gmail.com";}
Gmail可以自动将使用别名的所有内容(例如joe+testing@gmail.com
)转到您的地址joe@gmail.com
乘以* 11111为您提供比1到9更多的随机值(在Thilo示例中)
您可以添加用户exentions.js以获取随机值。
复制以下代码并将其保存为.js扩展名(randomgenerator.js)并将其添加到Selenium核心扩展(SeleniumIDE - <!> gt;选项--- <!> gt;常规选项卡)
Selenium.prototype.doRandomString = function( options, varName ) {
var length = 8;
var type = 'alphanumeric';
var o = options.split( '|' );
for ( var i = 0 ; i < 2 ; i ++ ) {
if ( o[i] && o[i].match( /^\d+$/ ) )
length = o[i];
if ( o[i] && o[i].match( /^(?:alpha)?(?:numeric)?$/ ) )
type = o[i];
}
switch( type ) {
case 'alpha' : storedVars[ varName ] = randomAlpha( length ); break;
case 'numeric' : storedVars[ varName ] = randomNumeric( length ); break;
case 'alphanumeric' : storedVars[ varName ] = randomAlphaNumeric( length ); break;
default : storedVars[ varName ] = randomAlphaNumeric( length );
};
};
function randomNumeric ( length ) {
return generateRandomString( length, '0123456789'.split( '' ) );
}
function randomAlpha ( length ) {
var alpha = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.split( '' );
return generateRandomString( length, alpha );
}
function randomAlphaNumeric ( length ) {
var alphanumeric = '01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.split( '' );
return generateRandomString( length, alphanumeric );
}
function generateRandomString( length, chars ) {
var string = '';
for ( var i = 0 ; i < length ; i++ )
string += chars[ Math.floor( Math.random() * chars.length ) ];
return string;
}
使用方法
Command Target Value
----------- --------- ----------
randomString 6 x
type username ${x}
上面的代码生成6个字符串,它分配给变量x
HTML格式的代码如下所示:
<tr>
<td>randomString</td>
<td>6</td>
<td>x</td>
</tr>
<tr>
<td>type</td>
<td>username</td>
<td>${x}</td>
</tr>
这是一个在JS中生成随机字母串的单行解决方案:
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".split("").filter(function(e, i, a) { return Math.random() > 0.8 }).join("")
用于粘贴到Selenium IDE。
从一小组替代品中随机选择的单线:
javascript{['brie','cheddar','swiss'][Math.floor(Math.random()*3)]}
<tr>
<td>store</td>
<td>javascript{Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 8)}</td>
<td>myRandomString</td>
</tr>
我对函数generateRandomString进行了一些改进。 当FF崩溃时,能够再次使用相同的随机数是很好的。
基本上,它会要求您自己输入一个字符串。如果你没有输入任何内容,它将生成它。
function generateRandomString( length, chars ) {
var string=prompt("Please today's random string",'');
if (string == '')
{for ( var i = 0 ; i < length ; i++ )
string += chars[ Math.floor( Math.random() * chars.length ) ];
return string;}
else
{
return string;}
}
在理解上面的RajendraChary的帖子时,我花了一些时间编写一个新的Selenium IDE扩展。
我的扩展程序将让用户使用lorem ipsum文本填充变量。有许多可配置的选项,它变成了一个很好的小命令。你可以做<!>“5个字| wordcaps | nomarks <!>”;生成5个lorem ipsum单词,全部大写,没有标点符号。
我已经彻底解释了安装和使用情况,并在此提供了完整代码库
如果你看一下代码,你就会知道如何构建类似的功能。
这是gmail示例的另一个变体:
<tr>
<td>runScript</td>
<td>emailRandom=document.getElementById('email');console.log(emailRandom.value);emailRandom.value="myEmail+" + Math.floor(Math.random()*11111)+ "@gmail.com";</td>
<td></td>
</tr>
Selenium RC 比 Selenium IDE 给您更多的自由,因为您可以:
- (1) 在某个字段中输入任意值
- (2) 在某个HTML表单中选择任意字段进行测试
- (3) 选择任意执行顺序/步骤来测试一组特定字段。
您询问如何使用 Selenium IDE 在字段中输入一些随机值,其他人已经回答了您如何使用 Selenium RC 在字段中生成和输入随机值。进入测试阶段(1):“在特定字段中输入任意值”。
使用 Selenium RC,您可以轻松完成第 (2) 和 (3) 阶段:通过使用受支持的语言(如 Java、PHP、CSharp、Ruby、Perl、Python)进行一些编程来测试任何执行步骤下的任何字段。
以下是执行阶段 (2) 和 (3) 的步骤:
- 创建 HTML 字段列表,以便您可以轻松地迭代它们
- 创建一个随机变量来控制步骤,例如 RAND_STEP
- 创建一个随机变量来控制该字段,例如 RAND_FIELD
- [最后,创建一个随机变量来控制输入到某个字段的值,比如 RAND_VALUE,如果你想做阶段 (1)]
- 现在,在模糊测试算法中,首先迭代 RAND_STEP 的值,然后在每次迭代时迭代 RAND_FIELD,最后迭代 RAND_VALUE。
看 我的另一个答案 关于模糊测试、Selenium 和白/黑盒测试
Math.random可能<!>“足够好<!>”;但是,实际上, Random class 通常比Math.random()更可取。使用Math.random,您获得的数字实际上可能不是完全随机的。本书<!>“Effective Java Second Edition <!>”;在第47项中介绍了这一点。
还有一个解决方案,我将其复制并粘贴到数百个测试中:
<tr>
<td>store</td>
<td>javascript{var myDate = new Date(); myDate.getFullYear()+"-"+(myDate.getMonth()+1)+"-"+myDate.getDate()+"-"+myDate.getHours()+myDate.getMinutes()+myDate.getSeconds()+myDate.getMilliseconds();}</td>
<td>S_Unique</td>
</tr>
<tr>
<td>store</td>
<td>Selenium Test InternalRefID-${S_Unique}</td>
<td>UniqueInternalRefID</td>
</tr>
<tr>
<td>store</td>
<td>Selenium Test Title-${S_Unique}</td>
<td>UniqueTitle</td>
</tr>
<tr>
<td>store</td>
<td>SeleniumEmail-${G_Unique}@myURL.com</td>
<td>UniqueEmailAddress</td>
</tr>
每个测试套件首先设置一系列变量(如果它是一个大套件,请使用像Set_Variables.html这样的单独文件)。然后,可以在整个套件中使用这些变量来设置,测试和删除测试数据。由于变量使用的是日期而不是随机数,因此您可以通过查找共享日期的对象来调试测试套件。