Appium桌面应用程序测试引发异常无法定位异常,但在测试运行之前启动应用程序时通过

时间:2019-05-29 15:12:02

标签: c# appium-desktop winappdriver

我正在尝试学习Appium并将其用于WPF应用程序测试。针对Calculator或Notepad的测试运行正常,但是最近在尝试测试自定义WPF应用程序时遇到问题。

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

在未首先启动应用程序的情况下运行测试时发生错误(因此,在设置阶段必须启动应用程序时)。 当应用在测试运行之前启动时,甚至在之前的失败测试运行中处于打开状态时,测试都通过。

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

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

我已经尝试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 =使用给定的搜索参数无法在页面上找到元素。   来源= WebDriver   堆栈跟踪:    在OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)    在OpenQA.Selenium.Remote.RemoteWebDriver.Execute处(字符串driverCommandToExecute,字典2 parameters) at OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(String mechanism, String value) at OpenQA.Selenium.Appium.AppiumDriver 1.FindElement(字符串,字符串值)

从WinAppDriver登录:

“ POST / session / 23293B57-F396-47CC-83EF-FCA491E269B0 / element HTTP / 1.1 接受:application / json,image / png 内容长度:56 内容类型:application / json; charset = utf-8 主持人:127.0.0.1:4723

{“正在使用”:“可访问性ID”,“值”:“ UserInfoButtonAID”} 找不到HTTP / 1.1 404 内容长度:139 内容类型:application / json

{“状态”:7,“值”:{“错误”:“没有这样的元素”,“消息”:“使用给定的搜索参数无法在页面上找到元素。”}}“ < / p>

1 个答案:

答案 0 :(得分:0)

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

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

此示例显示了如何切换窗口句柄:

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

您还可以通过从驱动程序中检查页面源属性来验证您是否具有正确的窗口句柄:_session.PageSource;。页面源是当前所选窗口句柄的xml表示形式。您可以将其放在Visual Studio监视中,然后将xml复制到xml formatter实用程序以提高可读性。

有关启动画面问题的其他信息以及解决该问题的其他方法,可以在here中找到。 一定要检查timotiusmargo用户的答案。