如何在UWP中使用WinAppDriver等待元素?

时间:2019-07-10 13:38:02

标签: selenium uwp appium coded-ui-tests winappdriver

我目前正在使用WinAppDriver将针对UWP应用的编码UI测试迁移到Appium,并且遇到了这个问题,我迫不及待想要显示一个元素。没有办法像Microsoft的编码UI测试那样等待元素“就绪”。

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方法中覆盖了该方法,这对我也不起作用。

Waiting for element before clicking with 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 个答案:

答案 0 :(得分:1)

您可以像这样实现等待功能:

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驱动程序问题。 有关此问题,请参见github上的以下问题: https://github.com/Microsoft/WinAppDriver/issues/329

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