Элемент тестовых бросков приложения Appium не может быть обнаружен как исключение, но проходит, когда приложение запускается до запуска теста - PullRequest
0 голосов
/ 29 мая 2019

Я пытаюсь изучить Appium и использую его для тестирования приложений WPF.Тесты на калькуляторе или блокноте выполняются нормально, но недавно я столкнулся с проблемой при попытке протестировать пользовательское приложение WPF.

Выдает тестовые приложения настольного приложения Appium. «Невозможно найти элемент на странице с помощью указанного поиска.параметры "исключение, но проходят без проблем, когда приложение запускается перед тестовым запуском.Итак, я предполагаю, что моя фаза Setup / Init неправильная, но я не знаю, почему.

Ошибка возникает, когда тест запускается без запуска приложения первым (например, когда фаза SetUp должна запустить приложение),Тест проходит, когда приложение запускается перед тестовым запуском или даже когда оно остается открытым после предыдущего неудачного тестового прогона.

Запуск приложения занимает около 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 Сообщение = Не удалось найти элемент на странице с использованием заданных параметров поиска.Source = WebDriver StackTrace: в OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError (отклик errorResponse) в OpenQA.Selenium.Remote.RemoteWebDriver.Execute (строковое значение DriverCommandToExecument * String 1.FF * StringText_1 * StringText_File_Next_File_Next_File_Name_Next_Lext_File_Name_Next_File_Next_F_LVE_Next_F_L_F_L_C_L_C_L_C_L_C_L_LF_1 * * *.

Журнал из 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

{"using": "идентификатор доступности", "value": "UserInfoButtonAID"} HTTP / 1.1 404 Not Found Content-Length:139 Content-Type: application / json

{"status": 7, "value": {"error": "no such element", "message": "Не удалось найти элемент на страницеиспользуя заданные параметры поиска. "}}"

1 Ответ

0 голосов
/ 31 мая 2019

Скорее всего, вам потребуется переключить дескриптор окна на правильный.

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.

...