Элемент, пытающийся найти до того, как сработает ожидание, но не удается

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

Waits.WaitForDisplayedEnabled(Scan.BarcodeField, Driver, 3);

... как только к нему обращаются (и до того, как он может быть запущен), код переходит к элементу на «странице», который я настроил, и говорит, что его невозможно найти. Я знаю, что элемент можно найти при отладке, поэтому с локатором элементов все в порядке. Есть ли лучший способ настроить элементы на страницах, не используя модель Page Factory? Казалось бы, фабрика страниц не сразу пытается получить доступ к элементу, поэтому она работает так хорошо. Ниже показано, как я настраиваю элемент...

public WindowsElement BarcodeField => Driver.FindElementByXPath("//*[@Name='Barcode' and @ClassName='TextBlock']");

person alex    schedule 18.06.2019    source источник
comment
Вы должны сохранить локатор в строке и передать его для ожидания вместо передачи WebElement. В вашем случае вы сначала вызываете FindElement, а ЗАТЕМ передаете его для ожидания. Это означает, что элемент уже существует.   -  person Fenio    schedule 18.06.2019
comment
Согласен с @Fenio. Другой способ: вы можете добавить время ожидания потока перед Waits.WaitForDisplayedEnabled, но это не рекомендуется.   -  person Devdun    schedule 18.06.2019
comment
Спасибо обоим. Обновлено с изменениями и работает нормально.   -  person alex    schedule 18.06.2019


Ответы (1)


Спасибо ребята. Требовались изменения здесь и там, но теперь я устанавливаю элементы следующим образом...

public By BarcodeField => By.XPath("//*[@Name='Barcode' and @ClassName='TextBlock']");

...и ожидания теперь используют By вместо WindowsElement

person alex    schedule 18.06.2019