Подтвердить что ты не робот

Выполнение теста внутри Backgroundworker внезапно заканчивается на элементах со многими дочерними элементами

моя общая настройка: мы написали небольшой импортер 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. Поэтому нить не должна быть полностью мертвой.

4b9b3361

Ответ 1

Следуя моему замечанию выше, я думаю, что ваш BackgroundWorker генерирует исключение, которое не отображается - возможно, из-за этого Ошибка /Feature.

Запуск этого маленького фрагмента показывает отсутствие необработанного исключения до тех пор, пока вы не отметьте "Брошено" в диалоге отладки/исключения.

Public Class Form1

    Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        For I As Integer = 0 To 100
            BackgroundWorker1.ReportProgress(I)
            Threading.Thread.Sleep(25)
            If I = 50 Then Throw (New NullReferenceException)
        Next
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        BackgroundWorker1.RunWorkerAsync()
    End Sub

    Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        ProgressBar1.Value = e.ProgressPercentage
    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        ProgressBar1.Value = 0
    End Sub
End Class

(Извините за VB, должен применяться к любой CLR)

Образец показывает (после нажатия кнопки) ProgessBar, который заполняется до 50%, а затем останавливается, не работает BackgroundWorker, no Done event. Вхождение в Throw просто выходит из метода.

Изменить: мой первый образец пропустил событие RunWorkerCompleted, которое сейчас запускается, поэтому это может быть совершенно не связано с вашим вопросом, извините за шум.