Можно ли создавать тесты Selenium с помощью плагина Firefox, которые используют случайно сгенерированные значения для помощи в проведении регрессионных тестов?
Полная история: Я хотел бы помочь своим клиентам провести приемочное тестирование, предоставив им набор тестов, которые используют некоторые умения для создания случайных (или, по крайней мере, псевдослучайных) значений для базы данных. Одна из проблем с моими тестами Selenium IDE на данный момент заключается в том, что они имеют предопределенные значения, что делает некоторые типы тестирования проблематичными.





Во-первых, Selenium IDE довольно ограничен, вам следует подумать о переходе на Selenium RC, который может управляться Java, Perl, Ruby или некоторыми другими языками.
Используя только Selenium IDE, вы можете встраивать выражения JavaScript для получения параметров команды. Вы должны иметь возможность вводить случайное число в текстовое поле, например:
type fieldName javascript{Math.floor(Math.random()*11)}
Обновлять: Вы можете определить вспомогательные функции в файле с именем «user-extensions.js». См. Ссылка на селен.
Я использую RC для собственного тестирования, но в этом случае я хотел бы дать моему клиенту несколько вспомогательных тестов, которые он может выполнить в своем браузере (без необходимости иметь копию среды разработки).
Просто подумал ... знаете ли вы, может ли Selenium вызывать функции Javascript, встроенные в страницу? Я мог бы создать несколько функций для генерации некоторых значений.
Я должен был использовать javascript в качестве значения в качестве отдельной команды. Я обнаружил, что не могу смешивать буквальный текст с javascript в одной команде. Следовательно, мой выглядел так: _ _ type fieldName Автоматически сгенерированный пользовательский typeKeys fieldName javascript {Math.floor (Math.random () * 11)}
Я попытался поместить это прямо в текстовое поле «Значение» в Selenium IDE. Однако он просто поместил именно это в текстовое поле, а не случайное значение.
Арон, я обнаружил, что для этого было полезно использовать storeEval - см. stackoverflow.com/questions/2105001/…
У меня не получилось. Мне пришлось использовать формат javascript {code_goes_here}, который используется в другом ответе.
Теперь можно использовать командный сценарий, потому что: Предварительная обработка параметров предупреждения с использованием тега javascript {} устарела, используйте сценарий выполнения.
Вы можете добавить пользовательский exentions.js для получения случайных значений.
Скопируйте приведенный ниже код и сохраните его как расширение .js (randomgenerator.js) и добавьте его в основные расширения Selenium (SeleniumIDE -> Параметры ---> вкладка Общие)
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>
Примечание. Если вы получили следующую ошибку, убедитесь, что ваш файл user-extensions.js имеет формат ASCII, а не UTF-8. Failed to load user-extensions.js!files=C:\TestScripts\random_generator.jslineNumber=1error=SyntaxError: illegal character
(На основе ответа Тило) Вы можете смешивать литералы и случайные числа следующим образом:
javascript{"joe+" + Math.floor(Math.random()*11111) + "@gmail.com";}
Gmail позволяет автоматически все, что использует псевдонимы, например, [email protected], будет отправляться на ваш адрес [email protected].
Умножение * 11111 дает вам больше случайных значений, чем от 1 до 9 (в примере Thilo)
+1 за самый простой способ. (Это можно напрямую использовать в тестовых примерах HTML Selenium и т. д. В качестве аргумента команды type)
Я обнаружил, что это работает, только если у вас есть формат javascript {code_goes_here}, который используется в этом ответе.
Вот однострочное решение для генерации случайной строки букв в 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)]}
Я немного улучшил функцию 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;}
}
Вот еще один вариант примера с Gmail:
<tr>
<td>runScript</td>
<td>emailRandom=document.getElementById('email');console.info(emailRandom.value);emailRandom.value="myEmail+" + Math.floor(Math.random()*11111)+ "@gmail.com";</td>
<td></td>
</tr>
Selenium RC дает вам гораздо больше свободы, чем Selenium IDE, поскольку вы можете:
Вы спросили, как ввести случайное значение в поле с помощью Selenium IDE, другие люди ответили вам, как сгенерировать и ввести случайные значения в поле с помощью Selenium RC. Это попадает в фазу тестирования (1): «Введите любое значение в определенное поле».
Используя Selenium RC, вы можете легко выполнить этапы (2) и (3): тестирование любого поля на любом этапе выполнения, выполнив некоторое программирование на поддерживаемом языке, таком как Java, PHP, CSharp, Ruby, Perl, Python.
Ниже приведены шаги для выполнения этапов (2) и (3):
См. мой другой ответ о тестировании фаззинга, Selenium и тестировании белого / черного ящика.
Разбирая смысл сообщения RajendraChary выше, я потратил некоторое время на написание нового расширения Selenium IDE.
Мое расширение позволяет пользователю заполнять переменную текстом lorem ipsum. Есть несколько настраиваемых параметров, и это превращено в небольшую красивую команду. Вы можете сделать такие вещи, как «5 слов | wordcaps | nomarks», чтобы создать 5 слов lorem ipsum, все с заглавной буквы, без знаков препинания.
Я подробно объяснил установку и использование, а также предоставил полная кодовая база здесь
Если вы взглянете на код, вы поймете, как создать подобную функциональность.
Math.random может быть «достаточно хорошим», но на практике Случайный класс часто предпочтительнее Math.random (). Используя Math.random, числа, которые вы получаете, на самом деле могут быть не полностью случайными. Книга «Эффективное второе издание Java» рассматривает это в элементе № 47.
<tr>
<td>store</td>
<td>javascript{Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 8)}</td>
<td>myRandomString</td>
</tr>
Хотели бы вы объяснить свой код или, возможно, немного отформатировать его, чтобы сделать его более читабельным?
хороший трикс, мне нравится. .toString (36) хеширует число в текстовую строку, а с помощью .replace все, что не является алфавитом, заменяется пустой строкой. Substr сокращает длину. Недостаток: вы не можете генерировать строки длиннее 9? символы.
Еще одно решение, которое я скопировал и вставил в сотни тестов:
<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). Затем эти переменные можно использовать в вашем наборе для установки, тестирования и удаления тестовых данных. А поскольку переменные используют дату, а не случайное число, вы можете отлаживать свой набор тестов, ища объекты, которые имеют общую дату.
См. Этот пост (у меня работает!): stackoverflow.com/questions/52894485/…