Appium / WinAppDriver не может найти контекстное меню - но только на некоторых машинах - PullRequest
2 голосов
/ 02 октября 2019

Я запускаю набор автоматических тестов пользовательского интерфейса с помощью Appium / Winappdriver в Windows 10. Среда тестирования скомпилирована в Visual Studio 2017 с использованием mstest.

Проблема, с которой я сталкиваюсь, связана с тестами, которые используютщелкните правой кнопкой мыши, чтобы открыть контекстное меню, затем выберите элемент в появившемся меню. Локально это работает. Это также работает на нашей удаленной машине CI / CD. Тем не менее, он не работает для двух других разработчиков проекта, и мы потратили два рабочих дня безрезультатно, пытаясь выяснить, почему.

У нас та же версия Windows (Windows 10, версия 1903),у нас такая же Visual Studio 2017 (мы тоже пробовали ее с 2019, не повезло), у нас одинаковое разрешение монитора (1920 x 1080), мы ориентируемся на ту же платформу .NET (4.72), у нас тот же WinAppDriver и т. д. .

Все остальное работает просто отлично. Но когда UI Test достигает этого контекстного меню, проверка завершается с ошибкой «Не удалось найти элемент на странице с использованием заданных параметров поиска».

Я использовал WinAppDriver UI Recorder, чтобы найти XPath дляэлемент. Мы также использовали его на компьютере другого пользователя и подтвердили, что для рекордера пользовательского интерфейса путь идентичен на обеих машинах.

Конкретный сбойный вызов:

Session.FindElementByXPath("/Pane[@ClassName=\"#32769\"][@Name=\"Desktop 1\"]/Menu[@ClassName=\"#32768\"][@Name=\"Context\"]/MenuItem[@Name=\"" + itemName + "\"]");

Вызов WinAppDriver на моем компьютере (успех):

{"using":"xpath","value":"/Pane[@ClassName=\"#32769\"][@Name=\"Desktop 1\"]/Menu[@ClassName=\"#32768\"][@Name=\"Context\"]/MenuItem[@Name=\"New Location\"]"}
HTTP/1.1 200 OK
Content-Length: 125
Content-Type: application/json

{"sessionId":"8970FDC1-E869-4304-A87D-D8F2CB711EA2","status":0,"value":{"ELEMENT":"42.856234.4.-2147483646.8140.18614751.1"}}

и тот же вызов на компьютере другого пользователя (сбой):

{"using":"xpath","value":"/Pane[@ClassName=\"#32769\"][@Name=\"Desktop 1\"]/Menu[@ClassName=\"#32768\"][@Name=\"Context\"]/MenuItem[@Name=\"New Location\"]"}
HTTP/1.1 404 Not Found
Content-Length: 139
Content-Type: application/json

{"status":7,"value":{"error":"no such element","message":"An element could not be located on the page using the given search parameters."}}

Опять все остальное работает. Другие тесты пользовательского интерфейса, которые не используют контекстные меню, вызываемые правой кнопкой мыши, работают нормально. Не работает только эта конкретная область.

То, что я пробовал до сих пор:

  1. Использование Thread.Sleep для принудительного длительного ожидания перед вызовом
  2. Завершение вызова с помощью DefaultWait и опрос его в течение нескольких секунд, чтобы увидеть, станет ли элемент доступным в течение этого времени.
  3. Когда выбрасывается «Не удалось найти элемент», повторите попытку до набора. количество раз, чтобы найти элемент.
  4. Много и много проверок, чтобы убедиться, что у нас одинаковая версия кода, одни и те же библиотеки, одинаковые пакеты nuget и т. д.
  5. Попытка гораздо более широкого локатора (Session.FindElementByName (itemName);)

Самый большой головной убор - то, что когда мы проверяем с помощью UI Recorder, элемент присутствует. Когда мы проверяем мою машину или машину удаленной сборки, WinAppDriver может найти ее как обычно. Но почему-то WinAppDriver не может найти его на машинах моего коллеги.

1 Ответ

0 голосов
/ 02 октября 2019

Это действительно специфическая проблема.

Я бы хотел исключить селектор XPath как потенциальную проблему здесь. Исходя из вашего синтаксиса, похоже, что вы используете абсолютный XPath. Они могут быть очень хрупкими в зависимости от обстоятельств. Не говорю, что это корневая проблема, но я хотел бы попробовать другой селектор, чтобы исключить это.

{"using":"xpath","value":"//MenuItem[@Name=\"New Location\"]"}

Использование относительной записи // указывает вашему пути искать в любом месте страницы, а не следоватьКонкретный путь к самому элементу.

Попробуйте и попробуйте узнать, поможет ли это вообще.

...