ランダムな値でのSelenium IDEの使用
-
03-07-2019 - |
質問
ランダムに生成された値を使用して回帰テストを行うFirefoxプラグインを使用してSeleniumテストを作成することはできますか?
完全なストーリー: データベースのランダムな(または少なくとも擬似ランダムな)値を作成するために、いくつかのスマートを使用するテストスイートをクライアントに提供することにより、クライアントが受け入れテストを行うのを支援したいと思います。現在のSelenium IDEテストの問題の1つは、定義済みの値があることです。これにより、一部のタイプのテストに問題が生じます。
解決
まず、Selenium IDEはかなり制限されているため、Java、Perl、Ruby、またはその他の言語で駆動できるSelenium RCへの切り替えを検討する必要があります。
Selenium IDEのみを使用して、JavaScript式を埋め込み、コマンドパラメーターを導出できます。 次の例のように、テキストフィールドに乱数を入力できるはずです。
type fieldName javascript{Math.floor(Math.random()*11)}
更新: <!> quot; user-extensions.js <!> quot;というファイルでヘルパー関数を定義できます。 Seleniumリファレンスを参照してください。
他のヒント
(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; Options --- <!> gt; generalタブ)に追加します
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でランダムな文字列を生成する1行のソリューションを次に示します。
"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テキストを入力できます。多くの設定可能なオプションがあり、それは素敵な小さなコマンドに変わりました。 <!> quot; 5ワード| wordcaps | nomarks <!> quot;のようなことができます。句読点なしで、すべて大文字の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)に分類されます:<!> quot;特定のフィールドに任意の値を入力します<!> quot;。
Selenium RCを使用すると、フェーズ(2)および(3)を簡単に実行できます。Java、PHP、CSharp、Ruby、Perl、Pythonなどのサポートされている言語でプログラミングを行うことにより、実行ステップの下でフィールドをテストできます。
次は、フェーズ(2)および(3)を実行する手順です。
- HTMLフィールドのリストを作成して、簡単に反復できるようにします
- ランダムな変数を作成して、ステップを制御します。たとえば、RAND_STEP
- ランダムな変数を作成してフィールドを制御します。たとえば、RAND_FIELD
- [フェーズ(1)を実行する場合は、ランダム変数を作成して、特定のフィールドに入力された値(RAND_VALUEなど)を制御します]
- ファジングアルゴリズム内で、最初にRAND_STEPの値を反復処理し、次に各反復でRAND_FIELDを反復処理し、最後にRAND_VALUEを反復処理します。
ファジングテスト、セレン、ホワイトについては、他の回答をご覧ください。 /ブラックボックステスト
Math.randomは<!> quot;十分に良い<!> quot;しかし、実際には、Math.random()よりも Randomクラスの方が望ましい場合がよくあります。 Math.randomを使用すると、取得する数値は実際には完全にランダムではない場合があります。本<!> quot; Effective Java Second Edition <!> quot;これについては、アイテム#47で説明しています。
もう1つのソリューション。これをコピーして数百のテストに貼り付けました。
<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のような個別のファイルを使用します)。これらの変数をスイート全体で使用して、テストデータを設定、テスト、および削除できます。また、変数は乱数ではなく日付を使用するため、日付を共有するオブジェクトを探すことでテストスイートをデバッグできます。