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

Petrov.Sergey

Регистрация: 11 июл 2013
Offline Активность: 04 фев 2021 20:52
-----

#132200 Сохранение sreenshot при ошибке теста

Написано Petrov.Sergey 15 июля 2014 - 07:28

Потому что у Вас блок catch ловит иксепшены только вида ArithmeticException.

Если в реалтайме вылетит иксепшн другого класса, Вы его просто не поймаете, но выполните финализацию без скриншота.
Измените на более общий:

catch (Exception e) {
     takeScreenshot(driver, name);
}

Кстати, мой вам совет:

1) не сохраняйте скриншоты в общей свалке - со временем всё тяжелее будет находить нужный.

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

3) так как Вы не можете гарантировать уникальность имён скриншотов, заведите себе правило перед именем ставить какой-нибудь 100% уникальный идентификатор. Таймстамп является одним из наилучших решений, но он достаточно длинный. Так как пул скриншотов хранится в директории "дата + время запуска", то можно использовать таймстамп без даты. А в зависимости от скорости выполнения автотестов можно избавиться ещё и от часов.

 

P.S. всё это из личного опыта, основанного на граблях.


  • 1


#132041 Что нужно для старта в автоматизации тестирования веб-сервисов?

Написано Petrov.Sergey 09 июля 2014 - 14:31

Если вебсервисы имеют открытую точку, к которой можно обратиться напрямую, то вебдрайвер не будет нужен совершенно.

 

Для тестирования вебсервисов SOAP-запросами Вам нужно WSDL. Это безоговорочно. Самое первое, что НЕОБХОДИМО.

Дальше два пути:

1) через SOAP UI (гуёвое приложение, позволяющее вручную или автоматически тестировать вебсервисы).

2) тру-JAVA-тестирование. Через JAXB создаёшь из WSDL объектную модель. Пишешь генератор корректного по всем параметрам запроса, имеющего не только внутренние зависимости, но и внешние (от БД, погоды, настроения разработчика и т.д.). Потом фигачишь тесты, каждый из которых сначала генерит тебе корректный запрос, который в нужном тесте ты корёжишь так, как тебе надо.

 

Я в своё время на предыдущей работе пошёл по второму пути, ибо испытываю расовую неприязнь к тесткейсам на статических входных данных (за исключением граничных значений и особых точек).

 

С REST-запросами не имел дела.

Но не думаю, что подход к их тестированию принципиально отличается.

Я имею в виду, что точно также разбить можно на 2 подхода: через SOAP UI и суровый JAVA-кодинг.

WSDL только не нужна. И JAXB, соответственно, тоже.

Но всё же (если через JAVA) какая-то объектная модель будет нужна со списком возможных параметров, доступных для дёргания и изменения, и примитивной логикой, описывающей связи между этими параметрами (если они есть), чтобы изначально генерить корректные запросы, а потом их корёжить.


  • 2


#132004 тестирование пересобирающейся конструкции приложения

Написано Petrov.Sergey 09 июля 2014 - 08:49

Проблема в том, что приложение в облаке?

Или проблема в том, что не можете не зависеть от ID?

Разве, кроме ID, других локаторов нет?


  • 1


#130278 отсортировать webElements в цикле

Написано Petrov.Sergey 12 мая 2014 - 09:18

Непонятны начальные условия и что должно получиться.
Как я понял: кубики разбросаны по экрану. Нужно поочерёдно навести их один на другой, начиная от большего к меньшему.
Так?
 
Тогда
List<WebeElement> list = new ArrayList<WebElement>(); // инициируем список всех элементов, которые будем двигать
list.add(driver.findElement(By.xpath("//div/h3"))); // добавили место, куда кубики будем складировать (платформу)
for (int i = 7; i > 0; i--) { // цикл по всем кубикам
   list.add(driver.findElement(By.xpath("//fl/bo[contains( text(),'"+i+"')]"))); // добавляем в список очередной кубик в порядке убывания циферки на нём
}

// итого список у нас состоит из платформы и кубиков 7-6-5-4-3-2-1

for (int i = 0; i < 7; i++) { // циклом по всему списку
   builder.clickAndHold(list.get(i+1)).moveToElement(list.get(i)).release().perform(); // кладём i+1 элемент на i
}
// итог = платформа-7-6-5-4-3-2-1 = то, что хотели.

  • 2


#130159 Выгрузка файла из консоли хрома.

Написано Petrov.Sergey 05 мая 2014 - 12:32

 

Не то сохранение файла имеется в виду.

BrowserMobProxy сохраняет файлы с сайта.

А тут сохранение файла из приложения Chrome.

Селениум тут вообще никаким боком не влезет. Ни через что.


  • 1


#129253 Путь к файлу

Написано Petrov.Sergey 08 апреля 2014 - 12:41

File file = new File(""); // создаёт пустой файл с пустым именем в каталоге проекта (рядом с файлом classpath)
File dir = new File(file.getAbsolutePath() + "\\dir_in_the_project"); // обращается к директории в проекте
Если нужно использовать директорию РЯДОМ с проектом, то используется следующая конструкция:
File dir = new File(file.getAbsolutePath() + "\\..\\dir_near_the_project"); // обращается к директории рядом с проектом
А вообще изучайте досовские команды перемещения по каталогам.
  • 1


#127821 Суть Stress, Concurrent and Volume тестирование

Написано Petrov.Sergey 05 марта 2014 - 06:20

Как я это понимаю:
 
Стресс - это негативный тест, призванный проверить, как система ведёт себя в "плохой" ситуации.
 
Stress же - это когда полтора миллиона специально обученных индусов одновременно начинает заливать на %абстрактный_видеохостинг% ultimate коллекцию немецких фильмов о любви. 
Сайт, естественно, упадёт, но в данном случае мы хотим проверить, что когда мы его поднимем, все (критичные) данные останутся невредимы. 
 
Как-то так = )
P.S. Хочу сказать, что все вышенаписанное - лишь мое понимание указанных видов тестирования и я могу ошибаться.

Не совсем.
Стресс - поведение во время DDOSа (один из примеров).
Пример с фильмами не совсем корректен. Недозалитый фильм в любом случае будет "битым". Заливка кучи фильмов только забивает канал, но не забивает ПО.
А вот выполнение мелких запросиков на пределе возможностей железяки - это нагрузочное (определение зоны комфорта, начала увеличения времени отклика, пика, максимума возможностей, отказа)
Длительное нагрузочное на пике или максимуме - стресс.
  • 1


#127819 Суть Stress, Concurrent and Volume тестирование

Написано Petrov.Sergey 05 марта 2014 - 05:51

Маленькая поправочка ко всем вышеответившим.

Concurrent - от слова "конкурирование". В J2EE специально даже выделен пакет классов и типов java.util.concurrent.atomic.*
Смысл конкуренции в том, что бины одновременно обращаются на изменение одного и того же параметра/переменной.
Чтобы не происходило коллизий, переменные, которые могут быть подвержены конкуренции, объявляют объектами соответствующих классов из названного пакета.

Применительно к тестированию яркий пример конкурентного тестирования: два пользователя в БД пытаются изменить одну и ту же сущность (значение в поле). Как должна себя повести система?
Не обязательно в БД. Может быть, просто какая-то глобальная переменная. Но обязательно одновременный доступ или с минимальной по времени разницей, достаточной для того, чтобы попасть в "конвеер".

Например, случай с транзакциями.
Все транзакции идут в очередь, которая обрабатывается не моментально.
Два человека открыли один и тот же объект и произвели каждый своё изменение на одно и то же свойство объекта.
Каждый создал свою транзакцию.
Конкурентный доступ даст возможность произвести изменение обоим людям в порядке создания их транзакций с возможностью отката изменений.
Неконкурентный доступ вывалит иксепшн на второй транзакции в лучшем случае. В худшем - свалит всё приложение (сталкивался с таким).
  • 1


#127137 Где в Москве хорошие курсы для тестеров по SQL, Java, Ios, Android

Написано Petrov.Sergey 17 февраля 2014 - 12:08

Итого:
1. курсы (о чём Вы спрашивали) Вам так и не посоветовали - зря вы выходит сюда обратились?!


Вы на полном серьёзе считаете, что существует курс "Всё обо всём"?
Предложенные направления развития: автоматизированное тестирование, SQL, JAVA, iOS, Android, C++ - совершенно из разных областей знаний.
Здесь форум тестировщиков. Тут вас программированию под андроид не научат. Запросы писать тоже не научат.
Поэтому каков вопрос, такой и ответ: "А ещё петь, плясать и играть на баяне..."
И лично я совершенно не считаю его хамским. И не считал бы, если бы он был адресован мне.
 

2. попытка направить Вас на курсы аля "что такое тестирование и т.п." за небольшую сумму, очевидно, закончилась ничем.

Как говорил один из известнейших мульт-персонажей: "А всё почему? И по какой причине? И какой из этого следует вывод?"
Попробуйте включить в работу маленькие серенькие клеточки.
 

От себя: ответ (организаторов курса по Ссылке) на вопрос про правду/ложь/глупость почему-то перевели на отзывы учеников... эти отзывы самим написать/отфильтровать удобные нельзя? там, наверное, так и пишут: после этого курса быстро сделал карьеру, стал признанным профи...?

А Вы их хотя бы прочитали, чтобы утверждать подобное?
Я сам был на этих курсах. Отзыв, кажется, не писал - не помню.
Но ощущения остались классные! Знания, которые были кашей, структурировались и разложились по полочкам. А к ним добавились ещё и новые. До прохождения курса у меня было одно понимание процесса тестирования. После - совершенно другое. Я стал более "глобально" смотреть. Пропала мелочность, присущая Вам.
И курс у меня был подороже 5к рублей. Но даже не смотря на это отношение к качеству преподавания описывается только положительными эмоциями.
 

Т.е. чего благодаря Школе можно достичь - вы заявляете чужими словами из отзывов! Но, как честные и благородные люди  под ними не подписываетесь?

А Вы хотите гарантии? Например, "Пройдя наш курс, Вы сразу станете гуру тестирования, и Вас возьмут в компанию Google с ежемесячным окладом не менее 100500 рублей?"
Да Вы наивный, как ребёнок!
Какие гарантии даёт средняя общеобразовательная школа? Никаких! Хочет ученик - научится. Не хочет - ему дадут аттестат о том, что прослушал курсы по предметам, и постараются забыть, как страшный сон.
Ваше же отношение к курсам предполагает поведение "Пусть меня научат, но сам я ничего делать не буду". Не будете - ради бога! Это Ваша жизнь, и Вам её расхлёбывать.
 

Почти все мои выпускники Школы Тестировщиков (с Большой Буквы :) ) находят работу в течение месяца...

А вот с этим я бы согласился, потому что сертификат о прохождении курсов Натальи Руколь на рынке ценятся работодателями. Но не надейтесь, заплатив за курс и ничего на нём не делая, получить этот сертификат. Я бы сравнил его со школьным аттестатом особого образца: не приложишь усилий - аттестат / сертификат не получишь. Причём усилия должны быть не по выканючиванию, а по выполнению домашних заданий, которые схожи с реальными ситуациями (а порой и построены на реальных ситуациях). Плюс своевременного выполнения ДЗ в наличии помощи тренера. Минус несвоевременного выполнения ДЗ - соответственно, в отсутствии желаемого объёма помощи со стороны тренера.
На курсы идут те, кто ХОЧЕТ УЧИТЬСЯ.


  • 2


#126445 не могу присвоить переменной значение из xpath

Написано Petrov.Sergey 01 февраля 2014 - 20:41

Не знаю, как посчитают мои коллеги, но я бы сделал так:

String hex = driver.findElement(By.xpath("//div[@id='swatch0']//div[@class='info']")).getText().split("\n")[3]

Смысл: беру значение всей ячейки, делаю сплит по переносу строки и беру 4-й элемент массива.


  • 1


#126192 Drag'N'Drop в Selenium WebDriver

Написано Petrov.Sergey 26 января 2014 - 19:17

Извините, я неправильно выразился. Целиком класс копировать не надо было :) Имелось в виду несколько строчек, как в приведённом мной примере.

В любом случае, разобрались - отлично!


  • 1


#126190 Drag'N'Drop в Selenium WebDriver

Написано Petrov.Sergey 26 января 2014 - 18:05

Весь код, содержащий эту строку, дайте, пожалуйста.

 

Я вставил в свой "мини-проект" Вашу строчку - никаких ошибок:

try {
	driver = Connect.init();
	int i = 0, count = 0;

	new Actions(driver).dragAndDrop(buttonSearch, buttonClear);
	for (Note note : root.getNote()) {
		......
	}
} catch (Exception e) {
	e.printStackTrace();
} finally {
	driver.quit();
}

При этом импорт содержит такую строчку:

import org.openqa.selenium.interactions.Actions;


  • 1


#125821 Как проверить элемент на существование в Selenium::Remote::Driver?

Написано Petrov.Sergey 14 января 2014 - 14:01


$driver->find_elements("//input[\@name='q']") > 0


Совет не ок. Как в плане производительности, так и в плане чистоты кода.

Знаете фразу "критикуешь - предлагай"?
Просто в текущем формате Ваша критика тоже "не ок".
  • 1


#125530 Выбор элемента по индексу

Написано Petrov.Sergey 30 декабря 2013 - 11:19

to Petrov.Sergey
Не совсем понял, для чего эта строчка

equals(new String("Артикул").toLowerCase())

почему нельзя так:
equals("артикул")
toLowerCase нужен, если мы хотим создать отдельный метод для поиска(передавать туда стринг, а он будет возвращать номер столбца). Но для данной задачи смысла особо нет

Закладываюсь под входной параметр и определение индекса нестатичного имени заголовка (какой на вход придёт).

1. имена переменных, кроме констант, нужно обозначать со строчной буквы, т.е. "сolumns", а не "Columns "
2. Давать переменным осмысленные имена, сolumns - это столбцы. Т.е. не понятно столбцы чего ? Товара, заявки или чего-то еще
3. Переменные в JAVA, кроме констант не принято писать через нижнее подчеркивание - code_index. Хотя бы так codeIndex (еще смотри пункт 1 и 2)
4. System.out.println ("code_index:"+code_index); - ставьте пробелы, т.е. хотя бы так System.out.println ("code_index: " + code_index);(еще смотри пункты 1-3)

1) соглашусь. Добавлю: с маленькой буквы принято писать имена переменных и методов. Имена классов - только с большой! Имена пакетов (package) - в общем-то, в любом регистре можно.
2) в предложенном случае столбцы - это список столбцов. Разношёрстных. Поэтому, имхо, в данном случае название переменной оправданно. Можно было бы, разве что, указать в имени переменной её тип (например, я использую периодически переменные: rowList, colList, resultTable, resultList, sQuery, etc)
3) это вопрос соглашения. Основные преследуемые цели - читабельность + понятность. Так что название переменной через "_" не является смертным грехом. Допустимо - значит можно! Читабельность не нарушена - значит хорошо. Наоборот некоторые конструкции без "пробелов" сложно читаются, а "_" как бы заменяет пробел. Всем известен мем: "Настоящие_программисты_пробелом_не_пользуются". Как Вы понимаете, это легче читается, чем "НастоящиеПрограммистыПробеломНеПользуются". И, кстати, я бы не сказал, что использование "_" является дурным тоном. Скорее, тут личная неприязнь к символу.
4) пробел перед открывающей скобкой входных параметров? Нафига?
  • 1


#125523 Выбор элемента по индексу

Написано Petrov.Sergey 30 декабря 2013 - 08:05

Ваш код после преобразований выглядит так:
List<WebElement> Columns = driver.findElements(By.xpath(".//table[@class='web_ar_datagrid']//th")); // список всех ячеек в одной из строк
int code_index = Columns.size(); // количество этих ячеек = количество столбцов в выбранной строке.

for (int i=0; i<Columns.size(); i++){ // по каждой ячейке
	if(Columns.contains("Артикул".toLowerCase())); // если среди всех слов в выбранной строке присутствует слово "артикул", то
		System.out.println ("code_index:"+code_index); // выводим количество столбцов в выбранной строке.
}
Во-первых, Вы проверяете содержимого не одной ячейки, а всей шапки сразу.
Во-вторых, Вы выводите не индекс ячейки, а полный размер таблицы (количество ячеек в выбранной строке)

Я бы написал как-нибудь так:
List<WebElement> columnList = driver.findElements(By.xpath(".//table[@class='web_ar_datagrid']//tr[1]//th")); // список всех ячеек в первой строке = заголовок таблицы (для этого вставил tr[1])
boolean found = false;
for (int i = 0; i < columnList.size(); ++i) {
	if (columnList.get(i).getText().toLowerCase().equals(new String("Артикул").toLowerCase()) {
		System.out.pritln("Номер столбца «Артикул» = " + (i+1));
		found = true;
		break;
	} 
}
if (!found)
	System.out.println("Столбец с названием «Артикул» не существует");

  • 1