TestStack.White ListBox.SelectedItemText не работает - PullRequest
0 голосов
/ 16 января 2019

У меня есть диалог WinForms с 2 ListBox элементами управления. В тестируемом приложении двойной щелчок по любому элементу в одном из элементов управления списком (я назову это списком управления) приводит к выбору соответствующего элемента в другом списке (SLAVE LISTBOX).

Мой тест приводит к тому, что в СПИСОК УПРАВЛЕНИЯ будет сделано несколько записей. Затем тест выполняет ListBox.SelectedItem.DoubleClick() для каждого из элементов списка CONTROL lISTBOX, сравнивая ListBox.SelectedItemText из обоих элементов управления списка.

В пользовательском интерфейсе приложения это ВСЕГДА работает, но тест вызова ListBox.SelectedItemText для SLAVE LISTBOX возвращает текст, совпадающий с тем, что правильно спит в пользовательском интерфейсе ТОЛЬКО на начальной итерации двойного щелчка \ сравнения.

Может кто-нибудь помочь мне понять, что я делаю не так? Спасибо!

Вот мой код:

public bool SelectMainEventViaErrorEvent(int eventIdx)
{
    bool bSuccess = false;

    errorEvents.Items.Select(eventIdx);
    System.Threading.Thread.Sleep(1000);

    errorEvents.Items.SelectedItem.DoubleClick();
    System.Threading.Thread.Sleep(1000);

    if (eventIdx > 0)
    {
        IVScrollBar vertScroll = mainEvents.ScrollBars.Vertical;
        vertScroll.ScrollDownLarge();
    }

    if (errorEvents.SelectedItemText == mainEvents.SelectedItemText)
    {
        bSuccess = true;
    }

    log.Info($"SelectMainEventViaErrorEvent({eventIdx}) selected error event = {errorEvents.SelectedItemText}");
    log.Info($"SelectMainEventViaErrorEvent({eventIdx}) selected main event = {mainEvents.SelectedItemText}");

    return bSuccess;
}

Как видно из рисунка ниже, текст в обоих списках идентичен. Однако вызов ListBox.SelectedItemText для верхнего списка (SLAVE LISTBOX) возвращает значение из первой итерации, которая соответствует первому элементу в нижнем списке (CONTROL LISTBOX) во время первой итерации двойного щелчка / сравнения.

Доказательство того, что текст выбранных элементов списка соответствует

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Мне никогда не удавалось заставить это работать, выполняя итерацию вперед через список errorEvent в моем коде автоматического тестирования, но он ДЕЙСТВИТЕЛЬНО работает при повторении назад через список errorEvent.

Телефонный код:

            for (int i = eventViewer.GetErrorEventsCount() - 1; i >= 0; i--)
        {
            bResult = eventViewer.SelectMainEventViaErrorEvent(i);
            if (!bResult)
            {
                break;
            }

            System.Threading.Thread.Sleep(2000);
        }

Проверочный код:

        public bool SelectMainEventViaErrorEvent(int eventIdx)
    {
        bool bSuccess = false;
        DisableToolTips(true);

        errorEvents.Select(eventIdx);
        errorEvents.SelectedItem.DoubleClick();

        System.Threading.Thread.Sleep(1000);

        log.Info($"SelectMainEventViaErrorEvent({eventIdx}) selected error event = {errorEvents.SelectedItemText}");
        log.Info($"SelectMainEventViaErrorEvent({eventIdx}) selected main event = {mainEvents.SelectedItemText}");

        if (errorEvents.SelectedItemText == mainEvents.SelectedItemText)
        {
            bSuccess = true;
        }

        return bSuccess;
    }
0 голосов
/ 17 января 2019

Сравнение с обычным текстом - плохая идея, так как «Текст»! = «Текст». В вашем случае вы можете использовать свойства DisplayMember и ValueMember.

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

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

public class Int_String
{
    public int _int { get; set; } // Important to be declared like properties and not like variables
    public string _string { get; set; }
}

Теперь давайте заполним наш список следующим образом:

public YourForm()
{
    List<Int_String> list = new List<Int_String>();
    list.Add(new Int_String { _int = 1, _string = "Some text" }); // I am populating it manually but you will populate it from DB or somewhere else
    list.Add(new Int_String { _int = 2, _string = "Some other text" });
    list.Add(new Int_String { _int = 3, _string = "One more text" });

    // Now when we have list we need to bind it to our listbox.

    // IMPORTANT!!!!!
    // Display member and Value member properties SHOULD be able to be added before and after assigning datasource to control (like combobox) BUT for some reason on listbox it only works when you assign it AFTER you bind your datasource to listbox.
    // If you ever work with other controls and use these values, ALWAYS declare display member and value member BEFORE you bind datasource. Why? For now let's just say it is much faster but explanation is for other question

    myListBox1.DataSource = list;
    myListBox1.DisplayMember = "_string"; // When you start typing .DisplayMember, you will not get that property in recommendation since it is hidden so do not think there is not that property there.
    myListBox1.ValueMember = "_int"; // Same as above
}

Теперь, когда вы заполняете списки вроде этого и второго таким же образом одинаковыми идентификаторами, вы можете просто сделать if(listbox1.SelectedValue == listbox2.SelectedValue) и сравнить их, даже если их текст не равен, но идентификатор равен.

БОНУС: Также вы можете расширить класс следующим образом:

public class Int_String
{    
    public int _int { get; set; }
    public string _string { get; set; }

    public string SomethingOther = "AsD";


    public bool IsTrue()
    {
        return true;
    }
}

затем связать его таким же образом и сделать это:

Int_String item = listbox1.SelectedItem as Int_String;
bool check = item.IsTrue();
MessageBox.Show(item.SomethingOther);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...