Перейти к содержимому

Публикации frei_by

176 публикаций создано frei_by (учитываются публикации только с 24 мая 2023)



#83310 SeleniumRC PHP обмен данными между тестами

Отправлено автор: frei_by 19 января 2011 - 17:17 в Selenium - Functional Testing

У меня первый тест и не тест вовсе, а просто подготовка данных для provider.

В PHPUnit можно делать дата драйвен тесты с помощью функции исполняющей роль провайдера данных.
В этой функции мне нужно на лету сформировать данные для из одной страницы и бомбить ими вторую страницу. Нужно считать на одной старнице массив данных броузером, а на другой странице броузером по этим данным устроить проверки. Я пробовал в функции провайдер вызвывать метод open - но естественно сессия для брозуера создана не была и поэтому фэйл. Решил сделать как отдельный тест в начале.

До этого у меня именно так и работало, в одном тесте считывал данные и проверял по ним. Но я решил немного рефакторнуть, и сформировать массив отдельно и сделать вот как здесь,
чтобы у меня provider сформировал именно так, и сделал это автоматически:
return array(
          array(0, 0, 0),
          array(0, 1, 1),
          array(1, 0, 1),
          array(1, 1, 3)
        );

Данные на второй странице зависят от данных на первой странице, причём на первой странице они генерирутся условно случайно, и результат работы второй страницы зависит от данных на первой.

Попробуйде этот массив сделать статическим и public

не помогло почему-то. Возможно ошибка в чём-то дургом, а возомжно phpunit пересоздаёт класс Example extends PHPUnit_Extensions_SeleniumTestCase перед каждым тестом, с него станется.

папка temp, serialize, fopen, fwrite,.... думаю буду делать так.



#83302 SeleniumRC PHP обмен данными между тестами

Отправлено автор: frei_by 19 января 2011 - 16:09 в Selenium - Functional Testing

Проблема такая. Занимаюсь написанием тестов для RC на php.
Есть конструкция из тестов:

class Example extends PHPUnit_Extensions_SeleniumTestCase
{
protected $arr_all; //property for script exchange

public function test_one()
	{...
	$this->arr_all = array (); //full array
	...
	var_dump ($this->arr_all);//array present
	}
public function test_second()
	{
	var_dump ($this->arr_all);//empty!!!!
	}
}

По моей задумке в первом тесте записывается $arr_all а во втором тесте считывается. ООП в php знаю очень приблизительно поэтому прошу снисхождения.

Для всего класса я объявляю свойство $arr_all;
далее в первом тесте test_one() присваиваю ему массив, и для проверки делаю var_dump - всё ок, свойство присвоилось.

Но когда во втором тесте test_second() я вновь пытаюсь обратится к данному свойству - то возвращает var_dump ($this->arr_all);//empty!!!! - NULL.

тесты исполняются один за другим. Пробовал сделать $arr_all; privaty либо public - не помогает. Можно конечно записать в сериализованный файл результаты работы одного теста а потом в другом тесте прочитать этот файл, но не вариант. Хотелось-бы именно в скрипте через переменные / поля класса.

Подскажите пожалуйста способ обмена информацией межуд тестами в пределах одного класса class Example ну или альтернативное решение. Спасибо...



#79514 @depend annotation

Отправлено автор: frei_by 03 ноября 2010 - 14:16 в Selenium - Functional Testing

Если кто-нибудь сталкивался, подскажите, что не так.

Пробую составить suite из нескольких небольших тестов:
создал папку test,
тесты из неё запускаю через cmd
phpunit path_to_tests

внутри для проверки создал один файл с тестами
sel_s1Test.php

Проблема: никак не могу настроить использование конструкции
/**
* @depends testlogin
*/

т.е. есть
class name1 extends PHPUnit_Extensions_SeleniumTestCase
{
protected function setUp() {}
protected function tearDown () {}

public function testlogin ()
{
$this->assertEquals(true, false);
}

/**
* @depends testlogin
*/
public function testnavigatetomodule ()
{}

}

выполняются как
FE

ожидаемый результат:
FS

Протип данного решения прочитал в
http://www.phpunit.d...st-dependencies

Например, с определением похожей декларации
/**
* *@dataProvider provider
*/
проблем не возникает. Т.е. @dataProvider работает, а @depends игнорируется.

если нужно, вот полный ответ от phpunit
PHPUnit 3.5.3 by Sebastian Bergmann.

FE

Time: 14 seconds, Memory: 4.50Mb

There was 1 error:

1) name1::testnavigatetomodule
PHPUnit_Framework_Exception: Response from Selenium RC server for testComplete().
ERROR: Element //a[@id='link_2' and text()='Сервис'] not found.


C:\www_pub\pricelist\1_Test.php:34

--


There was 1 failure:

1) name1::testlogin
Current URL: http://test1.webadmin.shop.by/index.php

Failed asserting that <boolean:true> matches expected <boolean:false>.

C:\www_pub\pricelist\1_Test.php:24

FAILURES!
Tests: 2, Assertions: 1, Failures: 1, Errors: 1.



#78734 перемнные в IDE

Отправлено автор: frei_by 12 октября 2010 - 14:17 в Selenium - Functional Testing

от жеж.
всего-то не хватало одниарных кавычек...
escape('${loc}')



#78708 перемнные в IDE

Отправлено автор: frei_by 11 октября 2010 - 13:55 в Selenium - Functional Testing

имеется объявленная перменная
storeLocation loc

вида URL адрес.

я хочу проэскейпить строку для использования в качестве имени файла скриншота.
Как это сделать?
пробую -
storeEval
escape(${loc}) - [error] Threw an exception: $loc is not defined
escape(storedVars[loc]) - [error] Threw an exception: loc is not defined
- выдаёт ошибку, переменная не определена.



#81121 StoreAllFields: как правильно использовать по назначению?

Отправлено автор: frei_by 02 декабря 2010 - 12:13 в Selenium - Functional Testing

без чтения доков по php никак.
Массивы там могут быть многомерными и одномерными. Использовать именованные ключи либо автоматические.
К массиву можно обращатся через цикл foreach либо использовать курсор массива.

Если не хотите читать доки по php могу предложить вам такое решение (написал за время кофе):
вот эта функция будет возвращать следующий элемент массива - один раз вставляете в свой код данный фрагмент -

$super_mass = $mass; //для сохранности создаёте копию массива

function robot () //фукнция при каждом вызове возвращает следующий элмент массива $$super_mass
{
global $super_mass;//делаете массив видимым
global $iiii;//делаете видимым счётчик
$arr = $super_mass; //создаётё рабочую копию массива,
$arr = array_reverse($arr);//делаете чёрную магию
if (($arr = array_reverse($arr))&&!FALSE)//делаете чёрную магию
    {
       $iskomoe = reset($arr);//возвращаете первый элемент массива
       unset($super_mass [key($arr)+$iiii]);//делаете чёрную манию
    }
return $iskomoe;
}

вызвать её нужно вот так:

$a = robot ();

советую вам посмотреть и по возможности оптимизировать её работу.



#81132 StoreAllFields: как правильно использовать по назначению?

Отправлено автор: frei_by 02 декабря 2010 - 14:53 в Selenium - Functional Testing

$mass[$i]
- возвращает $i элемент из неассоциативного одномерного массива вида
$arr = array (1,2,3,4,5,6);
если у вас
ассоциативный массив - то работать не будет
если у вас многомерный массив - работать не будет - т.е. вернёт значение array - если ваш массив - многомерный массив состоящий из других массивов.

плз выполните
var_dump ($mass);

и если оно выдаст что-то отличное от
$mass = Array (
[0] => 'значение 0'
[1] => 'значение 1'
...
)
то в этом кроется ошибка.

массив должен быть доступен в классе теста - на php тесты выполняются под phpunit с в нескольких наследуемых друг от друга классах.
Для обхода массива - используйте foreach.



#79780 Проблема с кодировкой

Отправлено автор: frei_by 10 ноября 2010 - 16:15 в Selenium - Functional Testing

Зарегистрироваться
посчитайте количество символов поделите на два и если у вас получится количесвто символов в строке
link=Зарегистрироваться
то даже не зная что такое "Идею 7.0.2" шито-то с однобайтовая-двубайтовая кодировка, мне так кажется.
туда и копайте.



#82731 Помогите обработать несколько однотипных элементов:)

Отправлено автор: frei_by 04 января 2011 - 14:26 в Selenium - Functional Testing

Я бы посоветовал через XPath привязыватся к ближайшему статическому элементу.
"//tr["+k+"]//div[@class='datacenter-ico']"

будет выбирать любые ноды (теги) <tr> c самого начала документа по порядку ["+k+"] и для каждого найденного <tr> искать первый попавшийся <div class='datacenter-ico'>. Что на мой взгляд может оказатся скользким решением.



#78991 Selenium Core и редирект

Отправлено автор: frei_by 20 октября 2010 - 06:38 в Selenium - Functional Testing

приведите пожалуйста пример сайта в доступного в сети чтобы можно было проверить такой редирект...



#83801 seleniumRC 1.0.3 + Firefox

Отправлено автор: frei_by 02 февраля 2011 - 12:08 в Selenium - Functional Testing

Извините, вопрос может быть наивный, а в ответе от сервера точно стоит заголовок Content-type = text/html ?



#79479 перебор чекбоксов

Отправлено автор: frei_by 02 ноября 2010 - 13:30 в Selenium - Functional Testing

мне кажется что многие сталкивались при написании тестов с задачей отметить несколько чек-боксов на странице объединённых одной формой. Например нужно написать несколько тест-кейсов в каждом из которых группа из 8 чек-боксов может быть отмечена какой-то своей комбинацией.

Всего комбинаций может получится 2^8 = 255 комбинаций.
Очень затруднительно написать 255 кейсов для которых задавать комбинацию по-своему.

Хотелось бы в тест кейс передвавать комбинацию отмеченных чек боксов в виде цифры - например
11010010 = 210
11010011 = 211

Я решил эту проблему написанием следующей функции:

function cbust($val,$arr_1)
    {
    $res = 1;
    for ($i=1;$i<=count($arr_1); $i++)
        {
         if ($val&$res){$arr_check[$i]=true;}else{$arr_check[$i]=false;}
         $res = $res << 1;
        }
    
    foreach ($arr_1 as $k => $v)
    {
        
        if ($arr_check[($k+1)]===true)
        {
            $flag = $this->isElementPresent($v);
            if ($flag!==true){$this->fail("Element $v is not present to check!");}
            $flag = $this->isChecked($v);
            if ($flag === true){} //nothing to do, it already cheked!
            else
            {$this->click($v);
            $flag = $this->isChecked($v); //is click make some action?
            if ($flag!==true){$this->fail("Element $v can not be checked!");}
            }
        }
        elseif ($arr_check[($k+1)]===false)
        {
            $flag = $this->isElementPresent($v);
            if ($flag!==true){$this->fail("Element $v is not present to uncheck!");}
            $flag = $this->isChecked($v);
            if ($flag===true)
            {$this->uncheck($v);
            $flag = $this->isChecked($v); //is uncheck make some action?
            if ($flag===true){$this->fail("Element $v can not be UNchecked!");}
            }
            else {} //nothing to do!
        }
        else
        {
            $this->fail('Oops, not true and not false...??'); //value of $arr_1 may be not set...
        }
    }
    $status = 'ok'; //for some reasons... It's pleasure to hear that all ok!
    return $status;
    }

где $val - числовой код комбинации, $arr_1 - массив XPAth чек боксов на странице.
У меня он выглядит так:

<?php
return
( array
    (
        '//input[@id=\'disp_field0\' and @type=\'checkbox\' and @value=\'short_item_name\']',
        '//input[@id=\'disp_field1\' and @type=\'checkbox\' and @value=\'long_item_name\']',
        '//input[@id=\'disp_field2\' and @type=\'checkbox\' and @value=\'short_desc\']',
        '//input[@id=\'disp_field3\' and @type=\'checkbox\' and @value=\'long_desc\']',
        '//input[@id=\'disp_field4\' and @type=\'checkbox\' and @value=\'price\']',
        '//input[@id=\'disp_field5\' and @type=\'checkbox\' and @value=\'icon_link\']',
        '//input[@id=\'disp_field6\' and @type=\'checkbox\' and @value=\'image_link\']',
        '//input[@id=\'disp_field7\' and @type=\'checkbox\' and @value=\'link_page\']',
        '//input[@id=\'disp_field8\' and @type=\'checkbox\' and @value=\'item_code\']',
        '//input[@id=\'disp_field9\' and @type=\'checkbox\' and @value=\'item_status\']'
    )
)

?>

здесь используется поразрядное сравнение $val с единицей, если true - значить xpath в массиве нужно отметить, если false - значит отмечать не нужно.
по моему получилось очень удобно и в тесте можно вызвыать как

$arr_2 = include_once ('./XPath/array2.php');
self::cbust($s2_p, $arr_2);

- например, если $s2_p будет равно 14, а всего элементов 8, то 14 = 1110,
00001110 - пример разметки 8 чек боксов.

Если будут какие-то замечания, буду рад прочитать...



#86257 selenium html source

Отправлено автор: frei_by 29 марта 2011 - 10:37 в Selenium - Functional Testing

Мне это почему-то напоминает работу некоторых xslt процессоров, где зависимости от того, хотите вы получить html или xml добавляется в конец экранирующий тег.
Потму что по некоторым спекам html допускается НЕ_применение экранирующих тегов, и если именно <input id="_wpnonce" name="_wpnonce" value="bc9e97a75f" type="hidden"> генерится из xml данных - то оно действтельно может оказатся без / хотя в оригинале было с /.



#78990 Silenium IDE

Отправлено автор: frei_by 20 октября 2010 - 06:36 в Selenium - Functional Testing

напишите структуру html в которую вставляется новая запись. Выше или ниже под дереву ближайший элемент со статическим id. Либо любой уникульный кусок дерева который можно использовать как ориентир.

если известно название, то //a[contains(text(),\'$ваш_текст\')]@href - атрибут href у ссылки содержащей текст = ваш текст
я думаю как минимум так,
если приведёте кусок кода - можно больше вариантов напридумывать.



#78703 Selenium IDE встроенный функции

Отправлено автор: frei_by 11 октября 2010 - 12:27 в Selenium - Functional Testing

Подскажите пожалуйста что делает функция storeAttributeFromAllWindows

В описании прочитал, что:

storeAttributeFromAllWindows(attributeName, variableName)
Generated from getAttributeFromAllWindows(attributeName)
Arguments:
* attributeName - name of an attribute on the windows
Returns:
the set of values of this attribute from all known windows.
Returns an array of JavaScript property values from all known windows having one.


Перевожу как "должна вернуть массив свойств JS из всех существующих окон."
использую как
storeAttributeFromAllWindows
attributeName = alt
variableName = str

Команда проходит без ошибок. Ожидаю что вернёт массив всех атрибутов alt.

Далее
echo
${str}

не возвращает ничего....

вопрос:
1) я прав?
2) как посмотреть этот массив используя только средства IDE?
3) как проверить наличие и содержание аттрибутов alt у всех изображений?



#83696 Применение Functional Testing

Отправлено автор: frei_by 31 января 2011 - 07:49 в IBM Rational - Functional Testing

Какой хитрый и коварный план, разместить в каждой теме вопрос, подходит-ли инструмент для тестирования "точек нет".



#79556 Selenium RC не закрывал окно браузера

Отправлено автор: frei_by 04 ноября 2010 - 14:23 в Selenium - Functional Testing

Как приятно читать доки по инструменту которым пользуешся. Я бы даже сказал выкинь бубен, и сделай как положено.
В PHPUnit в классе PHPUnit_Extensions_SeleniumTestCase от которого наследуется тест есть функция
protected function onNotSuccessfulTest(Exception $e)

Просто просмотрев которую становится понятно что и как может сделать Selenium.

всего-то делов - переопределить её в классе тесов.
И не нужно лазить в Driver.
Мне стыдно за те посты которые писал до этого.

Мне кажется пока-что это неплохим решением...



#79111 Selenium RC не закрывал окно браузера

Отправлено автор: frei_by 22 октября 2010 - 09:29 в Selenium - Functional Testing

Продолжая тему грязных хаков, а также особенностей общения с RC сервером, Очень интересные функции можно посмотреть в файле driver.php который для PHPUnit находится в папке
/pear/PHPUnit/Extensions/SeleniumTestCase/Driver.php

В частности, там можно найти функцию

public function stop()
    {
        if (!isset($this->sessionId)) {
            return;
        }

        $this->doCommand('testComplete');

        $this->sessionId = NULL;
    }

При вызове которой можно заметить что она посылает серверу команду 'testComplete', насколько я понимаю, и убивает sessionId.
Заккоментируйте

//$this->doCommand('testComplete');
//$this->sessionId = NULL;

И в этом случае если какой-то метод вернёт ошибку -
например, как вызывается
protected function doCommand($command, array $arguments = array())

protected function doCommand($command, array $arguments = array())
{
...
if (!preg_match('/^OK/', $response)) {
            $this->stop();

            throw new PHPUnit_Framework_Exception(
              sprintf(
                "Response from Selenium RC server for %s.\n%s.\n",
                $this->commands[count($this->commands)-1],
                $response
              )
            );
        }
Упс, сервер не вернул ОК - вызываем функцию stop(); - а в ней НЕ произошло сброса. И команда завершить тест серверу послана не была.))



#79068 Selenium RC не закрывал окно браузера

Отправлено автор: frei_by 21 октября 2010 - 12:26 в Selenium - Functional Testing

для phpUnit это может выглядеть например так:

protected function  tearDown() {
        parent::tearDown();
        //some functions
        die ('tear down!');
    }

Просто добавте эту функцию в класс

class Example extends PHPUnit_Extensions_SeleniumTestCase
{ 
    protected function setUp()
      {
        $this->setBrowser(BROWSER1);
        $this->setBrowserUrl(HOME);
      }
    
    public function test1() // ваш тест
    {}

    protected function  tearDown()
    {}
}

с die() это конечно грязный хак, если вы предложите что-то лучшее рад выслушать.



#85419 Подключение PHPUnit_Framework_TestListener

Отправлено автор: frei_by 09 марта 2011 - 13:17 в Selenium - Functional Testing

В cmd пишу: "phpunit test.php"
vs
Class GoogleTest could not be found in test3.php.



#84335 Как в Селениум РС кликнуть по ссылке зная только ее часть

Отправлено автор: frei_by 14 февраля 2011 - 07:35 в Selenium - Functional Testing

Используй регулярные выражения. Мне кажется что лучше regex языка, на котором пишешь для RC. В regex скрыта тайная сила.



#83337 Проблема с хинтами (Selenium IDE)

Отправлено автор: frei_by 20 января 2011 - 10:21 в Selenium - Functional Testing

Я думаю что достаточно проверить наличие аттирубта title у опередлённого элемента... А навести курсор и снять скринот чтобы потом посмотреть на скриншоте - не проще-ли открыть страницу и посмотреть "вручную", если без посмотреть всё равно никак?



#81913 размер окон браузера Selenium RC

Отправлено автор: frei_by 15 декабря 2010 - 11:22 в Selenium - Functional Testing

function resize ()

      {

    $this->storeEval("window.moveTo(0, 0);");

    $this->storeEval("window.resizeTo(1024, screen.availHeight);");

    }



#82017 размер окон браузера Selenium RC

Отправлено автор: frei_by 16 декабря 2010 - 11:46 в Selenium - Functional Testing

$this->selenium->resize ();
написало
Call to undefined method testunit_01::storeEval()


неправильно в класс подключили функцию.
неправильно её вызвали.
Знания об ООП в php никто для использования Selenium RC никто не отменял.

Если у вас функция принадлежит классу теста (НЕ классу selenium) то вызвайте её как метод из этого класса, если я правильно изъясгился.
$this->resize();



#87354 не нажимается кнопка Логин, хотя я её нажимал при записи

Отправлено автор: frei_by 20 апреля 2011 - 09:01 в Selenium - Functional Testing

<a onmousedown="submitForm('frmLoginPopup')" href="javascript:void(0)">Sign In</a>

selenium.mouseDown(BUTTON_ID) == onmousedown="submitForm('frmLoginPopup')"
вёрстальщик - умница. Наверное какая-то очень красивая кнопка, которая при нажатии сверкает и переливается цветами радуги.

при действии click - href="javascript:void(0) - заглушка.

Смысл в том, что на мой взгляд должно помочь onmousedown событие.