2

我正在尝试学习 Appium 并将其用于 WPF 应用程序测试。针对计算器或记事本的测试运行良好,但最近我在尝试测试自定义 WPF 应用程序时遇到了问题。

Appium 桌面应用程序测试抛出“使用给定的搜索参数无法在页面上找到一个元素”异常,但在测试运行之前启动应用程序时可以顺利通过。所以我猜我的设置/初始化阶段在某种程度上是不正确的,但我不知道为什么。

在没有先启动应用程序的情况下运行测试时会发生错误(因此当设置阶段必须启动应用程序时)。当应用程序在测试运行之前启动时,测试通过,或者即使它在之前失败的测试运行中保持打开状态。

应用程序启动大约需要 10 到 15 秒,在此期间首先出现斜线屏幕,然后是应用程序的主窗口。

项目中使用了Appium.WebDriver nuget packege,版本3.0.0.2

我已经尝试了 Thread.Sleep 30 秒,但它并没有解决问题。

[TestFixture]
public class DesktopAppSession
{
    protected WindowsDriver<WindowsElement> _session;
    protected const string WindowsApplicationDriverUrl = "http://127.0.0.1:4723";
    protected const string AppId = @"<path to app.exe>";

    [SetUp]
    public void TestInit()
    {
        if (_session != null)
            return;

        var appCapabilities = new DesiredCapabilities();
        appCapabilities.SetCapability("app", AppId);
        appCapabilities.SetCapability("deviceName", "WindowsPC");
        _session = new WindowsDriver<WindowsElement>(new Uri(WindowsApplicationDriverUrl), appCapabilities);

        Assert.IsNotNull(_session);

        Thread.Sleep(TimeSpan.FromSeconds(30));

        _session.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
    }

    [TearDown]
    public void TestCleanup()
    {
        if (_session != null)
        {
            _session.Quit();
            _session = null;
        }
    }

    [Test]
    public void UserInfoModalShowsUp()
    {
        var userInfoButtonAName = "UserInfoButtonAName";
        var userInfoButtonId = "UserInfoButtonAID";

        var userInfoButton = _session.FindElementByAccessibilityId(userInfoButtonId);

        Assert.True(userInfoButton != null);

        userInfoButton.Click();

        var userDetailsTitleLabel = _session.FindElementByName("User details");

        userDetailsTitleLabel?.Click();

        Assert.True(true);
    }
}

异常消息:

System.InvalidOperationException HResult=0x80131509 Message=使用给定的搜索参数无法在页面上找到元素。Source=WebDriver StackTrace:在 OpenQA.Selenium.Remote.RemoteWebDriver.Execute 的 OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(响应 errorResponse)(字符串 driverCommandToExecute,字典2 parameters) at OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(String mechanism, String value) at OpenQA.Selenium.Appium.AppiumDriver1.FindElement(字符串依据,字符串值)

来自 WinAppDriver 的日志:

“POST /session/23293B57-F396-47CC-83EF-FCA491E269B0/元素 HTTP/1.1 接受:application/json, image/png 内容长度:56 内容类型:应用程序/json;charset=utf-8 主机:127.0。 0.1:4723

{"using":"accessibility id","value":"UserInfoButtonAID"} HTTP/1.1 404 Not Found Content-Length: 139 Content-Type: application/json

{"status":7,"value":{"error":"no such element","message":"使用给定的搜索参数无法在页面上找到一个元素。"}}"

4

1 回答 1

1

您很可能需要将窗口句柄切换到正确的句柄。

Winappdriver 将窗口句柄用于顶级窗口。最有可能的是,您的启动画面将是一个顶级窗口,而您的实际应用程序也将是一个顶级窗口。所以 winappdriver 至少会有 2 个窗口句柄。您的驱动程序(_session在您的情况下)有一个名为的属性WindowHandles,其中包含一个窗口句柄列表。这些句柄按时间顺序添加,因此最近的句柄(来自您的应用程序的句柄)应该是最后一个窗口句柄。

此示例向您展示如何切换窗口句柄:

if (_session.CurrentWindowHandle != _session.WindowHandles.Last())
{
    _session.SwitchTo().Window(_session.WindowHandles.Last());
}

您还可以通过检查驱动程序中的页面源属性来验证您是否具有正确的窗口句柄,如下所示_session.PageSource;:页面源是当前选定窗口句柄的 xml 表示。您可以将它放在 Visual Studio 手表中并将 xml 复制到 xml 格式化程序实用程序中以提高可读性。

可以在此处找到有关启动画面问题和其他解决方法的其他信息。请务必查看用户 timotiusmargo 的答案。

于 2019-05-31T08:42:05.380 回答