![Фотография](https://software-testing.ru/forum/uploads/profile/photo-thumb-17655.jpg?_r=0)
verifyValue
#1
Отправлено 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]*)
#2
Отправлено 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');
}
}
}
}
#3
Отправлено 27 июля 2011 - 09:33
а еще при помощи плагина Firefinder можно проверять что именно на странице найдут ваши локаторы.
#4
Отправлено 27 июля 2011 - 10:25
#5
Отправлено 27 июля 2011 - 10:37
#6
Отправлено 27 июля 2011 - 11:30
("id=custom_198_" + '*' + "_time")
но не уверен
#7
Отправлено 27 июля 2011 - 11:47
#8
Отправлено 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
но проблема в том, что если при первой проверки выявлено несоответствие, то тест прерывается, а мне надо чтоб он выполнил ВСЕ проверки, а потом выдал результат где несоответствие, и скриншот
вероятно у вас возникает не тот тип эксепшена, который вы ожидали, а какой-то другой. в таких случаях обработчика такого эксепшена у вас нет и тест прервется.
#9
Отправлено 27 июля 2011 - 13:26
#10
Отправлено 27 июля 2011 - 15:05
каюсь, ends-with не работает в селениуме. :)к сожалению так xpath=//*[starts-with(@id, 'custom_198') and ends-with(@id, 'time')] НЕ работает тоже, (ни с contains ни без него)
у меня заработало так:
xpath=//*[starts-with(@id, 'custom_198') and contains(@id, 'time')]и так:
xpath=//*[contains(@id, 'custom_198') and contains(@id, 'time')]
способы не очень красивые с точки зрения эстетики задания локаторов, но работают. :)
#11
Отправлено 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 ...
}
Таким образом проверятся все условия, и если где то есть несоответствие, то тест упадет.
#12
Отправлено 11 ноября 2011 - 08:17
#13
Отправлено 25 января 2012 - 16:06
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных