Как мне ждать элемента, использующего WinAppDriver в UWP? - PullRequest
0 голосов
/ 10 июля 2019

В настоящее время я переносю свои тесты кодированного пользовательского интерфейса для приложения UWP в Appium, используя WinAppDriver , и я столкнулся с проблемой, которая заключается в том, что я не могу дождаться появления элемента. Нет никакого способа ждать, пока элемент будет «готов», как это сделал тест Coded UI от Microsoft.

В методе ClassInitialize все работает нормально (данные вводятся в окне входа в систему) и нажимается кнопка входа в систему. После запуска события click приложение показывает индикатор выполнения, пока пользователь не вошел в систему. Моя проблема в том, что я не могу дождаться компонентов после процесса входа в систему.

Я нашел несколько фрагментов кода, однако они мне не подходят. Вот метод расширения, который я сейчас использую:

public static IWebElement WaitForElement(this IWebDriver driver, By by, int timeoutInSeconds)
{
   if (timeoutInSeconds > 0){
      driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(timeoutInSeconds);
      var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
      return wait.Until(ExpectedConditions.ElementIsVisible(by));
   }
   return driver.FindElement(by);
}

Я также прочитал, что неявное время ожидания для драйвера Windows должно быть установлено:

session = new WindowsDriver<WindowsElement>(new Uri(WindowsApplicationDriverUrl), appCapabilities);
session.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(60);

и переопределено в методе WaitForElement, который также не работает для меня.

Ожидание элемента перед нажатием WinAppDriver

[TestMethod]
public void UploadDocuments()
{
   var UploadButton = session.WaitForElement(By.XPath("//Button[@AutomationId='AddDocument']"), 60);
   UploadButton.Click();

   session.FindElementByXPath("//ToolbarWindow32[@AutomationId='1001']").SendKeys(Keys.Control + "a");
   session.FindElementByXPath("//ToolbarWindow32[@AutomationId='1001']").SendKeys(testFilesFolder);

   //session.FindElementByName("Open").Click();
}

Обычно тест завершается сбоем в первой строке после завершения ClassInitialize. Поэтому я хотел бы подождать, пока кнопка «AddDocument» не появится, прежде чем продолжить тест.

Если у кого-то есть решение, я буду признателен за помощь. Спасибо!

1 Ответ

1 голос
/ 11 июля 2019

Вы можете реализовать функции ожидания следующим образом:

public WindowsElement GetElementByAutomationID(string automationId, int timeOut = 10000)
{
    WindowsElement element = null;

    var wait = new DefaultWait<WindowsDriver<WindowsElement>>(Driver)
    {
        Timeout = TimeSpan.FromMilliseconds(timeOut),
        Message = $"Element with automationId \"{automationId}\" not found."
    };

    wait.IgnoreExceptionTypes(typeof(WebDriverException));

    try
    {
        wait.Until(Driver =>
        {
            element = Driver.FindElementByAccessibilityId(automationId);
            return element != null;
        });
    }
    catch (WebDriverTimeoutException ex)
    {
        LogSearchError(ex, automationId);
        Assert.Fail(ex.Message);
    }

    return element;
}

Похоже, ваша проблема связана с драйвером appium-dotnet-driver. Смотрите эти вопросы на github по этому поводу: https://github.com/Microsoft/WinAppDriver/issues/329

https://github.com/appium/appium-dotnet-driver/issues/225

...