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

Фотография

verifyValue


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

#1 olga.topko

olga.topko

    Новый участник

  • Members
  • Pip
  • 23 сообщений
  • ФИО:Топко Ольга Владимировна

Отправлено 27 июля 2011 - 09:14

Добрый день!
Я в Селениуме начала работать совсем недавно. Столкнулась с такой проблемой: мне нужно выполнить несколько проверок элементов, ID поля постоянно меняется ( при этом мне нужно чтоб при несоответствии элемента тест продолжал выполнятся, а по завершению говорилось где несоответствие и делался скриншот). Я так понимаю, что нужно использовать регулярные выражения, может я неправильно его ипользую, проблема в том что выпадает ошибка Element Not Found
я экспортировала код из Selenium IDE, я программировать только начинаю и мне пока тяжело разобраться что к чему. вот кусок кода (но может можно сделать каким то другим способом?)
Подскажите пожалуйста как это реализовать на PHP

$this->click("//*/table[@id='activities-selector']/*/tr[1]/td[8]/div/a[1]");
$this->waitForElementPresent("//*/input[@name='custom_198_81']");

try
{


$this->assertEquals("07/13/2011", $this->getValue("id=custom_198_81"));

}
catch (PHPUnit_Framework_AssertionFailedError $e)
{

array_push($this->verificationErrors, $e->toString());

}

try
{

$this->assertEquals("11:11PM", $this->getValue("id=custom_198_81_time"));

}
catch (PHPUnit_Framework_AssertionFailedError $e)
{

array_push($this->verificationErrors, $e->toString());

}

try
{

$this->assertEquals("ytrewq", $this->getValue("id=custom_199_81"));

}
catch (PHPUnit_Framework_AssertionFailedError $e)
{

array_push($this->verificationErrors, $e->toString());

}
}


меняется в ("id=custom_198_81") часть _81; я пробовала дописывать ([0-9]*)
  • 0

#2 olga.topko

olga.topko

    Новый участник

  • Members
  • Pip
  • 23 сообщений
  • ФИО:Топко Ольга Владимировна

Отправлено 27 июля 2011 - 09:25

а еще я пробовала это выполнить другим способом, но у меня возникла проблема, в том что
1. у меня прерывается тест после первой проверки если там несоответствие;
2. если в первой проверки все соответствует, вторая проверка почемуто не выполняется (там несоответствие), а тест завершается удачно

$this->click("//*/table[@id='activities-selector']/*/tr[1]/td[8]/div/a[1]");
$this->waitForElementPresent("//*/input[@name='custom_198_81']");
$all_input = $this->getAllFields();
foreach ($all_input as $v)
{

if (preg_match("/custom_198_([0-9]*)/", $v, $match))
{

$this->verifyValue("//*/input[@id='$match[0]']", '07/13/2011');
}
else if (preg_match("/custom_198_([0-9]*)_time/", $v, $match))
{
$this->verifyValue("//*/input[@id='$match[0]']", '11:11AM');
}
else if (preg_match("/custom_199_([0-9]*)/", $v, $match))
{

$this->verifyValue("//*/input[@id='$match[0]']", 'ytrewq');
}
else if (preg_match("/status_id/", $v, $match))
{
$this->verifyValue("//*/input[@id='$match[0]']", 'completed');
}
}

}
}
  • 0

#3 Leoxa

Leoxa

    Новый участник

  • Members
  • Pip
  • 59 сообщений
  • ФИО:Алексей

Отправлено 27 июля 2011 - 09:33

попробуйте вместо ("id=custom_198_81") использовать что-то вроде ("xpath=//*[contains (@id, 'custom_198')]") или ("xpath=//input[contains (@id, 'custom_198')]").
а еще при помощи плагина Firefinder можно проверять что именно на странице найдут ваши локаторы.
  • 1

#4 olga.topko

olga.topko

    Новый участник

  • Members
  • Pip
  • 23 сообщений
  • ФИО:Топко Ольга Владимировна

Отправлено 27 июля 2011 - 10:25

да, спасибо, это частично помогло, элемент теперь находится нормально, но проблема в том, что если при первой проверки выявлено несоответствие, то тест прерывается, а мне надо чтоб он выполнил ВСЕ проверки, а потом выдал результат где несоответствие, и скриншот
  • 0

#5 olga.topko

olga.topko

    Новый участник

  • Members
  • Pip
  • 23 сообщений
  • ФИО:Топко Ольга Владимировна

Отправлено 27 июля 2011 - 10:37

а подскажите еще пожалуйста как мне прописать правильно (id=custom_198_81_time), если у меня меняется только часть с "81", а time не меняется?
  • 0

#6 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 27 июля 2011 - 11:30

попробуйте так
("id=custom_198_" + '*' + "_time")
но не уверен
  • 1

#7 olga.topko

olga.topko

    Новый участник

  • Members
  • Pip
  • 23 сообщений
  • ФИО:Топко Ольга Владимировна

Отправлено 27 июля 2011 - 11:47

к сожалению так ("id=custom_198_" + '*' + "_time") НЕ работает
  • 0

#8 Leoxa

Leoxa

    Новый участник

  • Members
  • Pip
  • 59 сообщений
  • ФИО:Алексей

Отправлено 27 июля 2011 - 12:33

а подскажите еще пожалуйста как мне прописать правильно (id=custom_198_81_time), если у меня меняется только часть с "81", а time не меняется?

например так:
xpath=//*[starts-with(@id, 'custom_198') and ends-with(@id, 'time')]
правда не уверен, что вместе оно работает. поэкспериментируйте с
contains, starts-with, ends-with

но проблема в том, что если при первой проверки выявлено несоответствие, то тест прерывается, а мне надо чтоб он выполнил ВСЕ проверки, а потом выдал результат где несоответствие, и скриншот


вероятно у вас возникает не тот тип эксепшена, который вы ожидали, а какой-то другой. в таких случаях обработчика такого эксепшена у вас нет и тест прервется.
  • 1

#9 olga.topko

olga.topko

    Новый участник

  • Members
  • Pip
  • 23 сообщений
  • ФИО:Топко Ольга Владимировна

Отправлено 27 июля 2011 - 13:26

к сожалению так xpath=//*[starts-with(@id, 'custom_198') and ends-with(@id, 'time')] НЕ работает тоже, (ни с contains ни без него)
  • 0

#10 Leoxa

Leoxa

    Новый участник

  • Members
  • Pip
  • 59 сообщений
  • ФИО:Алексей

Отправлено 27 июля 2011 - 15:05

к сожалению так xpath=//*[starts-with(@id, 'custom_198') and ends-with(@id, 'time')] НЕ работает тоже, (ни с contains ни без него)

каюсь, ends-with не работает в селениуме. :)

у меня заработало так:
xpath=//*[starts-with(@id, 'custom_198') and contains(@id, 'time')]
и так:
xpath=//*[contains(@id, 'custom_198') and contains(@id, 'time')]

способы не очень красивые с точки зрения эстетики задания локаторов, но работают. :)
  • 1

#11 AntonP

AntonP

    Новый участник

  • Members
  • Pip
  • 8 сообщений
  • ФИО:Перепеча Антон Юрьевич
  • Город:Минск

Отправлено 27 июля 2011 - 16:31

2. если в первой проверки все соответствует, вторая проверка почемуто не выполняется (там несоответствие), а тест завершается удачно

$this->click("//*/table[@id='activities-selector']/*/tr[1]/td[8]/div/a[1]");
$this->waitForElementPresent("//*/input[@name='custom_198_81']");
$all_input = $this->getAllFields();
foreach ($all_input as $v)
{

if (preg_match("/custom_198_([0-9]*)/", $v, $match))
{

$this->verifyValue("//*/input[@id='$match[0]']", '07/13/2011');
}
else if (preg_match("/custom_198_([0-9]*)_time/", $v, $match))
{
$this->verifyValue("//*/input[@id='$match[0]']", '11:11AM');
}
else if (preg_match("/custom_199_([0-9]*)/", $v, $match))
{

$this->verifyValue("//*/input[@id='$match[0]']", 'ytrewq');
}
else if (preg_match("/status_id/", $v, $match))
{
$this->verifyValue("//*/input[@id='$match[0]']", 'completed');
}
}

}
}

Здраствуйте!
Насколько я понял вторая проверка не срабатывает потому что первый if=true и соответственно в else цикл уже не заходит и тест завершается успешно.
Если вы хотите чтобы все if проверялись поочереди, то поубирайте else. Получится что то вроде:

if (condition1){
verifyTrue ...
}
if (condition2){
verifyTrue ...
}
if (condition3){
verifyTrue ...
}
if (condition4){
verifyTrue ...
}

Таким образом проверятся все условия, и если где то есть несоответствие, то тест упадет.
  • 1

#12 Radost_

Radost_

    Новый участник

  • Members
  • Pip
  • 20 сообщений

Отправлено 11 ноября 2011 - 08:17

а если поле имеет класс "validate", у меня метод с xpath=//*[contains(@id, 'custom_198') and contains(@id, 'time')] не срабатывает, поле просто пропускается. есть какая-то хитрушка в этом?
  • 0

#13 Элли

Элли

    Новый участник

  • Members
  • Pip
  • 16 сообщений
  • ФИО:Нина

Отправлено 25 января 2012 - 16:06

когда меня обучали, мне вообще запрещали использовать в тесте айдишники, присвоенные не с человеческой подачи... только классами
  • 0


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

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