моя общая настройка: мы написали небольшой импортер excel с небольшим gui, который позволяет не программистам писать и выполнять gui-тесты с помощью команд типа Button.Click. Основой является TestStack.White. После импорта файла excel и некоторых других пользовательских взаимодействий тест начинается внутри System.ComponentModel.BackgroundWorker, который отлично работает, если я не смотрю (или даже не взаимодействую) с элементами, содержащими огромное количество дочерних элементов.
Но как только я взаимодействую с TestStack.White.UIItems.WindowItems.Window или TestStack.White.UIItems.UIItemContainer, у которого много элементов, тестовое исполнение заканчивается.
С взаимодействием я имею в виду все, от простых вещей, таких как нечетная проверка или присваивание, в локальную переменную или прочее, например, просить ее дочернюю группу. Некоторые примеры завершения тестового выполнения: 1)
if(theElement != null){ //everything after this line does not happen. The operator doesn't seem to be overloaded
doStuff(); //it never reaches this point
}
2)
UIItemContainer pointOfInterest = theElement; //everything after this line does not happen
3)
System.Diagnostics.Debug.WriteLine("AmountOfElements: " + UIAnchor.Items.Count); //the output doesn't come. everything after this line does not happen
В окнах без сотен элементов все три примера работают по назначению.
Многими элементами, которые я имею в виду, например, Окно, в котором есть ScrollView внутри, который имеет таблицу с десятками или даже сотнями записей, где каждая запись состоит из 3-4 столбцов с текстом или флажком или что-то в этом роде.
Фоновые работники RunWorkerCompleted, а также Disposed не вызываются. Я вообще не получаю исключений, даже с целенаправленными блоками try/catch я ничего не получаю от этого. Отладчик достигает линии, которая вызывает проблему, и что она. После этого ничего не приходит, даже с ожиданием 1 часа.
Вместо этого я получаю только пару разных "Нить {какой-то шестнадцатеричный id} вышел с кодом 259 (0x103)". в окне вывода Visual Studio. Это из моего последнего теста:
The thread 0x830 has exited with code 259 (0x103).
The thread 0xfc0 has exited with code 259 (0x103).
The thread 0xc04 has exited with code 259 (0x103).
Насколько я понял это сообщение, это означает, что Thread все еще жив. qaru.site/info/94713/...
Если я перейду в debuger, чтобы проверить содержимое элемента, вызывающего ошибку, я получаю тайм-ауты по всем элементам, которые пришли после Items (List with childelements), включая Items.
Также проблема не (или не должна быть?), что основной поток заканчивается, как это было в случае с этим потоком: Попытка выполнить код BackgroundWorker в отладке, но программа неожиданно заканчивается, потому что gui все еще работает нормально.
Есть ли у кого-нибудь идея, что может произойти здесь или как исправить эту проблему?
Вот как я запускаю приложение:
Application app = TestStack.White.Application.Launch(pathToExeFile);
context.setApp(app); //context is a class with static variables to eas the access to all kind of stuff, so that i access it without having 20 parameters in every method (e.g. Button.Click())
Затем пользователь устанавливает, какое окно он хочет протестировать (которое может быть или не быть модальным окном, но в окнах без сотен элементов оно работает):
foreach (Window win in context.getApp().GetWindows()) {
System.Diagnostics.Debug.WriteLine("###SelectWindow: " + win.Name + " # " + win.PrimaryIdentification + " # " + win.Title);
if (win.Name.Equals(nameOfWindowToTest)) {
System.Diagnostics.Debug.WriteLine("###SelectWindow: gefunden");
context.UIAnchor = win;
System.Diagnostics.Debug.WriteLine("####SelectWindow: Anz Items: " + context.UIAnchor.Items.Count); //this gets called, but is the very last thing the thread does
return null; //does not happen
}
}
context.UIAnchor - это элемент, упомянутый выше. Впоследствии вызываются методы, заданные пользователем (например, Button.Click). Смешно контекст .UIAnchor = выигрыш и результат работы items.count.
Обновление. Если я закрываю приложение, которое должно быть протестировано, перед закрытием программы тестирования я получаю исключение ElementNotAvaiableException. Поэтому нить не должна быть полностью мертвой.