如何在 UWP 中使用 WinAppDriver 等待元素?
How do I wait for an element using the WinAppDriver in UWP?
我目前正在使用 WinAppDriver 将 UWP 应用程序的编码 UI 测试迁移到 Appium,我遇到了这个问题,我迫不及待地想要显示一个元素向上。无法像 Microsoft 的编码 UI 测试那样等待元素成为 "ready"。
在 ClassInitialize
方法中一切正常(数据在登录视图中输入)并且单击了登录按钮。触发点击事件后,应用程序会显示一个进度条,直到用户登录。我的问题是我无法在登录过程后等待组件。
我找到了一些代码片段,但是它们似乎对我不起作用。这是我目前使用的扩展方法:
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
方法中被覆盖,这对我也不起作用。
[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' 按钮弹出。
如果有人有解决方案,我将不胜感激。
谢谢!
您可以像这样实现等待功能:
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
我目前正在使用 WinAppDriver 将 UWP 应用程序的编码 UI 测试迁移到 Appium,我遇到了这个问题,我迫不及待地想要显示一个元素向上。无法像 Microsoft 的编码 UI 测试那样等待元素成为 "ready"。
在 ClassInitialize
方法中一切正常(数据在登录视图中输入)并且单击了登录按钮。触发点击事件后,应用程序会显示一个进度条,直到用户登录。我的问题是我无法在登录过程后等待组件。
我找到了一些代码片段,但是它们似乎对我不起作用。这是我目前使用的扩展方法:
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
方法中被覆盖,这对我也不起作用。
[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' 按钮弹出。
如果有人有解决方案,我将不胜感激。 谢谢!
您可以像这样实现等待功能:
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