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

Фотография

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


  • Авторизуйтесь для ответа в теме
В теме одно сообщение

#1 frei_by

frei_by

    Постоянный участник

  • Members
  • PipPipPip
  • 177 сообщений
  • ФИО:Дмитрий

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

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

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

#2 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 02 ноября 2010 - 14:55

Неплохо :)
Хотя, мне кажется, было бы удобнее передавать параметр непосредственно в двоичной форме, а не в десятеричной.
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных