提问者:小点点

Appium桌面应用程序测试抛出元素无法定位异常,但在测试运行前启动应用程序时通过


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

Appium桌面应用程序测试抛出“使用给定的搜索参数无法在页面上定位元素”异常,但在测试运行前启动应用程序时没有问题。所以我猜我的安装/启动阶段不知何故不正确,但我不知道为什么。

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

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

Appium. WebDriver nuget packkege在项目中使用,版本3.0.0.2

我已经尝试了Thread。睡眠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:at OpenQA.Selenium.Remote.RemoteWebDrive.UnpackAndThrowOnError(Response errorResponse)at OpenQA.Selenium.Remote.RemoteWebDrive.Execute(String driverDirecdToExecute,Dicrix2参数)at OpenQA.Selenium.RemoteWebDrive.FindElement(String机制,String值)at OpenQA.Selenium.Appium.AppiumDriver1.FindElement(String by,String值)

来自WinAppDriver的日志:

"POST /session/23293B57-F396-47CC-83EF-FCA491E269B0/elementHTTP/1.1接受:application/json, image/png Content-Llong:56 Content-Type:application/json;charset=utf-8主机:127.0.0.1:4723

{"使用":"辅助功能id","值":"UserInfoButtonAID"}HTTP/1.1 404未找到内容长度:139内容类型:应用程序/json

{"status": 7,"value":{"error":"没有这样的元素","message":"使用给定的搜索参数无法在页面上找到元素。"}}"


共1个答案

匿名用户

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

WinappDrive为顶级窗口使用窗口句柄。最有可能的是,您的启动屏幕将是顶级窗口,而您的实际应用程序也将是顶级窗口。因此winappDrive将至少有2个窗口句柄。您的驱动程序(在您的示例中为_session)有一个名为WindowHandles的属性,其中包含窗口句柄列表。这些句柄按时间顺序添加,因此最近的句柄(来自您的应用程序的句柄)应该是最后一个窗口句柄。

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

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

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

可以在此处找到有关闪屏问题和其他修复方法的更多信息。请务必查看用户timotiusmargo的答案。