суббота, 26 ноября 2011 г.

Программирование для тестировщиков

Решила пойти по горячим следам и оставлять отзывы сразу, а не после всего курса. Пока еще воспоминания свежи. Иначе в конце отчет будет довольно короткий, все ведь не упомнишь.

Так что, если вы еще размышляете, идти ли вам на эти курсы... Добавлю свое мнение к остальным!

Итак, встал вопрос об автоматизации тестирования. Дано добро на курсы, когда мы выберем инструмент. Я нашла себе курсы на специалисте, где автоматизации учат в два этапа, на первом даются основы программирования. Вот эти

Свыше их забраковали:

Основы программирования и баз данных - полная чухня

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

Мое мнение - этот курс отметаем.
Хотя я нашла много незнакомых слов в описании основ программирования :)) Ну ладно.
Скачала себе триалку Тесткомплита и стала думать дальше.

Следующее предложение было уже о тренинге Алексей Баранцева.
Что помогло обосновать? Как раз таки отзывы уже прошедших ))) В которых упоминается домашнее задание, без которого в обучении - никуда. Плюс мое собственное мнение об Алексее как о хорошем докладчике (как раз прошла первая ConfeT&QA)

А вот программисты этот курс обсмеяли, на заметку Алексею, почитав расписание, вердикт был примерно такой же, как в цитате выше - "Первые два занятия вообще вода, лучше книжку почитай". Слова "А пока мы просто научимся решать конкретные практические задачи.
" не очень спасли, оставив ложное мнение о первых уроках.


И вот я участник данного курса :)
До его запуска я успела определиться таки с программой для автоматизации (мой выбор - Watin), и даже написать код. С помощью программиста мы написали тест, потом отрефакторили, потом вообще стерли и переписали )))

Однако что-то усвоить я уже успела. Поэтому первые два занятия мне были более-менее знакомы. И до разделения тестов и UI модельки (так она называется у меня, часть автоматизатора) мы дошли. И до принципа устойчивости тестов.

Формат обучения, если кто-то еще не в теме - просмотр записи вебинара с прошлых курсов. А то меня сильно удивил первый урок, во-первых, я невнимательно прочитала о том, что будут выкладываться записи и настроилась на то, что в понедельник в 5 будет вебинар. Даже время осводила.

А тут - курс прислали в пятницу. Сразу началась паника - это что мне, дз до понедельника надо сделать?!!!

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

Первые 4 домашних задания не представили особой сложности. По крайней мере, мне не пришлось рыскать по интернету в поисках ответа на какой-то вопрос, а я читала об этом в других отзывах. Видимо, это еще предстоит!

Но ведь не зря люди ходят на семинары по темам, в которых они и так уже эксперты - всегда можно вынести какую-то новую мысль или идею.

В автоматизаци я далеко не эксперт, так что мысли вынесла. Правда, не прям на занятии, на занятии я как раз думала о том, что это мне, в принципе, уже знакомо, я это делала, просто в другом фреймворке.

А вот когда вернулась к своей работе, вынесенные знания мне очень помогли! Просто знайте - даже если вам ДЗ показались легкими, попробуйте заавтоматизировать свое приложение. Без практики не возникнут вопросы! А они возникнут ))))

Итак, сегодня у меня наконец-то нашлось время снова заняться своими автотестами. В последний раз я размышляла, как мне обращаться к разным страницам. Так-то я с подсказками программиста код писала, а тут решила начать новую ветку, чтобы закрепить свои знания.

И после второго урока я поняла, что мне надо удалить нафиг те новые классы, которые я уже успела создать, и вместо них сделать один - "Навигация". Ну конечно! Это же элементарно, Вадсон (с)

Вдохновленная новой идеей, взяла ручку и бумагу и накидала свои мысли туда. Потом уже перенесла в MindMap. Одобрение "рукописи" я, кстати, получила в одной любопытной книжке, о которой я напишу потом, когда прочитаю :)) Пока я вытащила оттуда мысль "сначала нарисуйте свою презентацию на бумаге, а потом беритесь за компьютер. Конечно, многие скажут, что проще делать сразу в PowerPoint, и это бессмысленная трата времени. Но с помощью карандаша и бумаги вы сможете сгенерировать большое количество идей за небольшой период времени, не отвлекаясь на манипуляции с мышью и клавиатурой"

Перенести мысли в компьютер самостоятельно я, однако, не смогла ))))
Тут же всплыла куча вопросов, пришлось опять прибегнуть к помощи программистов.

Но, по крайней мере, я уже знаю, какая у меня будет структура кода, и я вижу косяки в моем старом коде, я вижу то, что пора менять, пока не стало слишком поздно :)))

Тут и вылез новый вопрос. Есть код:

 
 
private Div ГоризонтальноеМеню()
{
var div = Browser.Div(Find.BySelector("#id"));
return div;
}

public void ПереходимВМодуль()
{
var div = ГоризонтальноеМеню();
div.Span(s => s.Text.Equals("НазваниеМодуля")).Click();
}

Но первая строка с div - это повторяющийся код, с него можно в несколько мест попасть. А если его id изменится? Везде менять?
А как достать? Ведь если мы вытащим var, сможем ли мы к нему обратиться? И как??
В сомнении я выделила эту строку и нажала волшебную комбинацию, на которую указал Алексей еще в первом занятии: Рефактор - Excract Metod. И получила такой же гениальный по простоте ответ:

public void ПереходимВМодуль()
{
var div = Browser.Div(Find.BySelector("#id"));
div.Span(s => s.Text.Equals("НазваниеМодуля")).Click();
}
Сама бы я долго думала, как же это написать))))
Так и пригодилось первое же занятие. Спасибо рефакторингу! Что бы мы без него делали))))

Очень жду 5 занятия, так как вопрос записи в файл меня мучается уже больше двух недель. И также надеюсь, что еще до этого занятия я научусь с этим работать, а потом сравню методы - свой и Алексея, вытащу идеи, до которых не дошла сама)

четверг, 24 ноября 2011 г.

Проблемы с компьютером, точка зрения Заказчика

Или «продавцам железа посвящается»… Сегодня мне бы хотелось поговорить со стороны Заказчика. Может, это на меня так рассылка Сергея Бережного влияет… А на самом деле просто не могу смолчать, крик души!
Что же необходимо делать людям, продающим компьютеры, чтобы угодить Заказчикам?
1.       Предоставлять качественное оборудование (кэп :) )
2.       Предоставлять качественные гарантийные услуги
3.       Предоставлять удобные дополнительные услуги (доставка)
Первый пункт в пояснениях, думаю, не нуждается. А вот о втором и третьем хочется рассказать. На примере своей ситуации. Разберем кейс со стороны Заказчика:
Я, как Заказчик, заплатила за некие услуги. А именно – поставку качественного оборудования. В довольно известной фирме. Почти 2 года назад. Как раз через 1,5 месяца закончится гарантийный срок. За что же я плачу? За то, чтобы как минимум 2 года у меня все работало. А так как мне хотелось увеличить этот срок, то и денег я заплатила побольше, выбрав комплектацию покачественнее.
Теперь ситуация. Месяц назад, как раз где-то 24 числа, я прихожу домой и включаю компьютер. Казалось бы – ничего не предвещало. Уже собиралась уйти, так как загружается он минуты 2-3, зачем перед ним все это время торчать? Но какая-то подозрительная тишина меня остановила. А где работа кулеров и тд? Смотрю – выключен… Хм, ок, снова нажимаю кнопку – полный игнор. Словно стоит себе блок питания, не включенный в сеть. В первый раз синяя лампочка около кнопки «Пуск» мигнула, я потому и отвернулась от него – все ж нормально. На повторные нажатия уже никакой реакции.
Что в итоге? В гарантийку его увезли (за мои, блин, деньги!), запустили, протестировали и вернули с диагнозом «да у вас все хорошо». Ага, просто так деньги за доставку выкинула. Долго я тогда злилась, почему, если вещь на гарантии и не работает, Я же еще и платить должна? Но так посмотрела сегодня – во многих магазинах, если не во всех, самодоставка в гарантийный отдел. Ну или платно, если сам не можешь. Хорошо, опускаем этот момент.
Заходит ко мне водитель, «получите распишитесь». Щаз, разбежалась:
- Давайте проверим.
- Да я ж в этом ничего не понимаю…
- Ничего, ничего, мы просто проверим, включается ли он.
Ну а что, мне же звонили из гарантийного отдела, объяснили, что проверили кучу разных тестов – и все хорошо! И вообще у них компьютер с первого раза загрузился. Но мне же не померещилось, что он не работал? Включаем в сеть, нажимаем на «пуск» - ноль эмоций, фунт презрения. С чем я его в ремонт и отдавала… Дальше пошло веселье. Включали разными шнурами (свое питание и от монитора), проверяли их и саму розетку на ноутбуке и мониторе – все работает! Кроме компьютера. И так и сяк. Позвонили туда, в гарантийку. Водитель сам с ними разговарил «и правда, не включается, мы то сделали, се сделали». На том конце провода человек уже решил приехать (вон оно! Правильное решение). Но… Передумал. Время позднее… Привози, говорит водителю, обратно. Вешаем трубку, делаем пару последних попыток… И, о чудо, он включился. Как? Почему? Да фиг его знает.
Водитель радостный уехал. Я тоже была вполне довольна. Все же мой мощный компьютер и старый (относительно) ноут не сравнить. Все хорошо? Да. Ну, правда, уже около года при загрузке комп выдавал «CPU FAN ERROR», после чего включался. Ну, не страшно. Мне это все говорят. Страшно то, что после их тестирования. блин, комп стал включаться ровно до этой надписи и требовал нажать F1 для продолжения. Не очень удобно, каждый раз при запуске ждать минуту, жать кнопку и ждать еще минуту… Ну ладно, фиг бы с вами. Работает ведь.
Вчера. Прихожу домой, включаю компьютер – синяя лампочка зажглась, включаю монитор и иду раздеваться. Очень удобно, чтобы не ждать этой «CPU FAN ERROR», включать его сразу по приходу. Возвращаюсь – экран черный… Смотрю на компьютер – он не включен. Пытаюсь включить…. Ну и опять та же фигня. Месяца не прошло. Первые мысли:
Как???!!! Ну КАК???!!!
В недавней рассылке про Заказчика было – «вам могут отказать в продвижении вашей идеи просто потому, что у Заказчика плохое настроение, не выспался, зуб болит, с женой поругался, что-то случилось и тд. Пробуйте еще!». Очень верное замечание. В мысленное бешенство меня привели две вещи – презентация и деньги.
Давно уже занялась презентацией, для начинающих тестировщиков. И, разумеется, не положила ее в DropBox. Ну конечно, все мы задним умом крепки. А ведь хотела сразу после SQA Days выступить. Почти все готово… Эх! И собиралась ей заняться именно вчера! Во вторник внезапно нашлись силы и желание поработать с ней, но была уже полночь и я уже выключила компьютер.
Ну и деньги тоже, сторонний банкомат сожрал карточку. Делают новую 7 рабочих дней. Вот пока ее не сделают, можно и не занимать денег/трясти заначку. Было. А с доставкой фиг, ищи средства. Поэтому именно в данной ситуации лишние траты вызывают дикое раздражение.
В отделе продаж мне предложили забрать компьютер через 2 дня (хорошо, что у меня ноутбук есть!)… С 12 до 17. И это относится к третьему пункту. Удобна мне такая доставка? В рабочее то время? Конечно же, нет. Ладно, что я работаю с web приложениями, я могу отпроситься и поработать из дома. Но многих ли так же легко отпустят с работы? Это на самом деле очень важный пункт, ведь у таких компаний часто Заказчики – те, кто работают, не могут сами отремонтировать и довезти. Поэтому удобное время доставки, как, например, с 12 до 16 или с 16 до 19 на выбор – огромный плюс в работе.
Но чего же я хочу во втором пункте, если учесть, что стенания на тему «почему я должна платить, если вещь на гарантии» необоснованны?  
Где же я прочитала эту умную мысль… Что надо копать глубже. Пытаться разобраться, какую проблему хочет решить ваш заказчик. (Например, заказывает сайт «типа ВКонтакте», а хочет, если копнуть, совсем другое) То есть надо не только знать, какие у него требования, но и зачем. Какую проблему он хочет решить с помощью вашей команды. И тогда вам не придется потом переделывать все.
И если вы сделаете это – если разберетесь в проблеме Заказчика, а не просто выполните то, что вам сказали, то обретете себе благодарного клиента, замечательную репутацию и прочие фишечки. О вас сформируется мнение, как о профессионалах. В любом случае, Заказчику будет приятно, что вы интересуетесь его проблемой, а не отмахиваетесь.
Как еще одна зарисовка отношения Заказчика. Когда я перешла на выделенку со Стрима, то все было хорошо. Скорость, пинг и так далее. Но потом мне понадобилось подлючиться по vpn к рабочему сайту. А так как делала я это впервые, то была немного не готова к обрыву остальных соединений. В итоге – паника, нет сети. Раньше все понятно было, ХР, модемчик. Перезагрузил его и нет проблем. Или сеть переподлючил. А тут – как? Звоню в техподдержку. Мне отвечают, что это «ой, там сложно, маршрутизацию настроить и тд». В общем, оплатите 1к за выезд специалиста и он приедет к вам после выходных. После выходных? Да вы что, как я без интернета??
Стала обзванивать друзей и за 5 минут наводящих комментариев мы нашли значки сетей в седьмой винде (кто же знал, что он в настройке адаптера) и выяснили, что, чтобы вернуть мне интернет, достаточно было нажать там «подлючить». Круто, да? За пару кликов мышкой деньги сдирать… А ведь я ситуацию обрисовывала – КАК у меня пропал интернет, после подключения по  vpn. И специалисты техподдержки вполне могли подсказать мне проверить именно состояние сети. Но… Не захотели, видимо.
Тем не менее, как провайдер меня они устраивают, за почти год сотрудничества обрывы связи можно по пальцам пересчитать, и подлючается интернет обратно буквально за секунды (а не как Стрим, по 5 минут лампочка моргала, что особенно критично, когда «там» 24 человека ждут своего Рейд Лидера). Я даже советую его знакомым! Но. Если мне надо звонить им в техподдержку, бастует все мое существо. Я всячески отлыниваю и уговариваю кого-нибудь мне в этом помочь))) Потому что у меня уже отпечаталось в мозгах, что мне не помогут, только деньги попробуют содрать. Но так как мы почти не пересекаемся (вот разве что когда комп первый раз сдох, а вай-фая еще не было, звонили мак-адрес перенастроить), то и сотрудничаем нормально. А если бы они делали для меня софт, осталась бы я их Заказчиком?
Ну и вернемся к проблеме с компьютером. Я лично считаю, что на мою проблему начихали. Ведь у них и в прошлый раз комп завелся сразу. Без последовавшего тестирования. А у меня – когда его хотели забирать обратно под девизом «и правда не включается». И вчера я звонила, опять говорила, что мне в общем-то все равно, если он у них сразу заведется. Мне надо, чтобы он завелся У МЕНЯ!
Вот мелькала же умная мысль у мастера, приехать и посмотреть на месте. Вот это был бы сервис. Это было бы решением проблемы. Ведь моя проблема была не протестировать профилактически. А чтобы он у меня заработал. Дома! А не где-то там еще. Тут и причину искать надо на месте. Да, может, там вообще с розеткой проблемы, непонятно, правда, почему он тогда внезапно заработал почти на месяц.
Но. Проблема была озвучена, а в качестве решения предложено только лишь «Ну мы у себя второй раз посмотрим, если все будет ОК, значит, все в порядке, а то, что он у вас не работает – не наши проблемы». Какой-то неправильный подход… Я бы лучше те же деньги «за доставку» за выезд мастера на дом отдала, если бы он был заинтересован помочь мне найти и устранить проблему!
А если нет заинтересованности в клиенте, то и клиент не заинтересован в сервисе, увы.

пятница, 18 ноября 2011 г.

"Бага не повторяется!", сказал программист, не читая условия

Навеяно разбором кейса от Александра Орлова.
Очень понравился третий пункт - мягко провести диалог, повернув его в нужное тебе русло. Не каждый так умеет. У меня бы первой реакцией было нахамить в ответ на хамство :)) А у вас?

Предлагаю разобрать кейс тестировщиков.
Думаю, вам будет знакома ситуация.

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

Находим ошибку, заводим:
"Выбрав право 1, переходим на элемент из места 1... *описание ошибки*
При этом если перейти к элементу из места 2, все будет ОК".

По баге прилетает вопрос - как же так, она не повторяется. Меняю права, так как работаю уже с другим - все повторяется. Опять вопрос: "Нет, вот, я ставлю право 2 и ...". "Конечно, не повторяется, в описании совсем другая роль выбрана".

ОК, передаем разработчикам. Бага возвращается с комментарием "не воспроизводится". Опять лезу, выполняю предварительные шаги (ну а вдруг и правда не воспроизводится, всякое бывает, была бага, потом раз и нету, потому что ее поправили, делая другое). Да все же повторяется. Помня о первом сомнении, отписываюсь "Все повторяется. Проверь, то ли право ты выбрал и из того ли места перешел". То есть даже дается подсказка, где человек мог ошибиться и неверно прочитать.

Нет, не повторяется и точка. В доказательство прикрепляется линк... На элемент, открытый из места 2 -_-
Хотя это специально было оговорено в теле баги + в комментариях )))))

Итак! Как вы ведете себя в таких ситуациях?

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

Я пока выбрала звонок в скайпе. Ну и по возможности больше визуализации))) То есть рисунков. Правда, в данном примере я все же настаиваю на точном (и коротком! Там не было захламления текстом, в результате чего может возникнуть недопонятость) описании, к которому рисунки излишни.

четверг, 10 ноября 2011 г.

LogonDialogHandler VS Windows 7 (Решение в Watin)

Заметки юного автоматизатора... Так уж получилось, что свои тесты я синхронизирую между тремя компами - рабочий ноутбук (ХР), домашний ноутбук (Vista) и домашний комп (Win7). Компьютер у меня очень "вовремя" полетел, так что поставила студию и на домашний ноут. Проблем с двумя ноутбуками не было никаких - все хорошо, все круто, все работает. А потом мне вернули комп... У вас тоже Windows 7? И вы хотите начать автоматизацию? Тогда честно вам скажу, семерка - зло!

Нет. Не так.

Windows 7 - ЗЛО!!! Особенно для начинающих автоматизаторов, которые в код то круглыми глазами смотрят, "ой, а что это?", а тут еще идеально работающий код валится на первой же стадии.

Да да, это страшное слово "Залогиниться". При моих попытках освоить TestComlete я, кстати, семерку так и не победила. Неуверенно тыкаясь в кнопочку рекорда и осторожно корректируя полученный скрипт до понятного, я была страшно огорчена тем, что прекрасно работающие тесты на ХР не запускаются дома. Вообще. Ведь для любого теста надо вначале залогиниться... А он не видит найденный ранее Alias. Пыталась перезаписать скрипт, найти окно логина семерки. Но проиграла этот раунд)))

Потом у меня кончилась триал-версия, так что больше я TestComlete не занималась, и как обойти окно логина там, я не знаю.

Едем дальше. Watin, VS 2010, C#. Все хорошо, все здорово. Запись логина:

browser.DialogWatcher.Add(new LogonDialogHandler(@"login", "password"));

На семерке запускаю - вводит логин и пароль в строку логина, причем упорно так вводит, раз 20 ввел, пока скрипт не остановила. Пошла за помощью к программистам. Посидели, погуглили. Нашли обход.

Делаем так. В панели инструментов у нас есть такая штучка, как Debug, если нет, вытаскиваем ее туда:




Открываем выпадающий список - Configuration Manager. А теперь угадайте, где в этом менеждере кнопка "добавить новую конфигурацию" )))))

Там снова открываем выпадающий список "Active solution configuration " и находим завестную кнопочку "new". Создаем себе "WIN7 Debug"

Потом открываем свойства проекта - закладку Build и вводим в поле Conditional compilation symbols "WIN7"

Сохраняем конфигурацию. Прекрасно, теперь у нас есть 2 одинаковых конфигурации, которые различаются только наличием этих символов.

Переписываем ту строку кода в:

#if
WIN7 Browser.DialogWatcher.Add(new Windows7LogonDialogHandler(@"login", "password"));
#else
Browser.DialogWatcher.Add(new LogonDialogHandler(@"login", "password"));
#endif

Но и это еще не все! Создаем новый класс, пишем туда большой и страшный код, который я приведу внизу, а то не вижу тут тега спойлера. Класс называем "Windows7LogonDialogHandler .cs"
К нему то наша строчка и будет обращаться. Далее все просто. Если запускаем с ХР или Висты - конфигурацию выбираем "Debug", если с семерки - "WIN7 Debug". И все работает!

Ага. Щазззз. Проблемы могут и не кончиться)) Итак, мы прогуглили это дело, нашли тот скрипт для класса "Windows7LogonDialogHandler .cs" , который будет ниже, запустили (у программиста моего тоже семерка на рабочем компе) - работает! Ура?

Прихожу домой, запускаю - открывает окошко логина и... Ничего туда не вводит. Ну хоть не вбивает логин и пароль, как сумашедший, и то хлеб... Но блин, неудобно же! На компе фильмы смотреть, в игры играть и тд и тп, а как поработать надо - ноутбук включать. Одно дело, когда ты там тесты запустил и сидишь себе, играешься на основном компьютере. А когда ты туда лезешь их писать... Согласитесь, неприятно.

Прихожу на работу. Снова копируем мой проект (мои компы его через Dropbox получают, чтобы мне с флешкой каждый день не бегать), ставим у программиста на семерке - работает! Прихожу домой - не работает :(

Подключаю товарищей, дебажим код и что выясняется? У коллеги англ семерка, а у меня - русская. Поменяла в коде три названия, если у вас англ семерка, вам надо будет сменить "Другая учетная запись", "Пользователь" и "Пароль" на англ наименования... А я надеюсь, что мне не придется запускать свои тесты на английской семерке )))))

Хотя надо что-то придумать с этим. Нехорошо. Можно просто еще одну конфигурацию, в принципе, сделать... Надо ли? Ладно, посмотрим. Надеюсь, что когда вы начнете изучать автоматизацию, то проблему логина вы быстро обойдете, уже зная решение :))  А так в принципе это пока единственная проблема семерки, которую я знаю. Дальше все пойдет хорошо, главное, залогиниться!

Собственно, скрипт для русской версии:

using System.Linq;
using System.Windows.Automation;
using WatiN.Core.DialogHandlers;
using WatiN.Core.Native.Windows;


namespace UIModel
{

public class Windows7LogonDialogHandler : BaseDialogHandler{
{

private readonly string _username;
private readonly string _password;
AndCondition _conditions = new AndCondition(new PropertyCondition(AutomationElement.IsEnabledProperty, true),new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window));
readonly AndCondition _listCondition = new AndCondition(new PropertyCondition(AutomationElement.IsEnabledProperty, true),new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.ListItem));
readonly AndCondition _editCondition = new AndCondition(new PropertyCondition(AutomationElement.IsEnabledProperty, true),new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit));
readonly AndCondition _buttonConditions = new AndCondition(new PropertyCondition(AutomationElement.IsEnabledProperty, true),new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button));

public Windows7LogonDialogHandler(string username, string password)
{
_username = username;
_password = password;
}
public override bool HandleDialog(Window window)
{
if (CanHandleDialog(window))
{
var win = AutomationElement.FromHandle(window.Hwnd);
var lists = win.FindAll(TreeScope.Children, _listCondition);
var buttons = win.FindAll(TreeScope.Children, _buttonConditions);
var another = (from AutomationElement list in lists
where list.Current.ClassName == "UserTile"
where list.Current.Name == "Другая учетная запись"
select list).First(); another.SetFocus();
foreach (var edit in from AutomationElement list in lists
where list.Current.ClassName == "UserTile"
select list.FindAll(TreeScope.Children, _editCondition)
into edits
from AutomationElement edit in edits
select edit)

{
if (edit.Current.Name.Contains("Пользователь"))
{
edit.SetFocus();

var usernamePattern = edit.GetCurrentPattern(ValuePattern.Pattern) as ValuePattern;
if (usernamePattern != null) usernamePattern.SetValue(_username);
}


if (edit.Current.Name.Contains("Пароль"))
{
edit.SetFocus();
var passwordPattern = edit.GetCurrentPattern(ValuePattern.Pattern) as ValuePattern;
if (passwordPattern != null) passwordPattern.SetValue(_password);
}
}

foreach (var submitPattern in from AutomationElement button in buttons
where button.Current.AutomationId == "SubmitButton"

select button.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern)
{
submitPattern.Invoke();
break;
}

return true;
}
return false;
}

public override bool CanHandleDialog(Window window)
{
return window.ClassName == "#32770";
}
}
}

среда, 2 ноября 2011 г.

Нелогичность - залог успеха!

Самое оригинальное поздравление я получила от начальника одного из своих проектов :)

Команда разработки поздравляет с Днем Рождения лучшего в мире генератора случайных идей!!

Ольга!

В мире угрюмых разработчиков и занудных аналитиков мы желаем оставаться тебе такой же веселой и нелогичной! ;)
Ломая шаблоны структурно-алгоритмического мышления, ты легко находишь недостатки в системе, которую мы делаем, и где-то наверное в нас самих.
Это прекрасные качества для тестировщика, и мы уверены, они будут подкреплены новыми профессиональными знаниями и большим опытом работы.


Обучайся, тестируй, автоматизируй, регистрируй, а мы постараемся поменьше на тебя ругаться ;)

С Днем Рождения!!!!
После таких слов сразу хочется с новыми силами и горящими глазами (которые потухли от слишком большой усталости) пойти и сломать какой-нибудь шаблон ))))