Xamarin.UITest: как получить координаты дисплея устройства

Я пишу UITest на С#, используя Xamarin.UITest.

Как я могу получить координаты экрана устройства динамически в UITest?


person Brandon Minnick    schedule 22.12.2016    source источник


Ответы (2)


В Xamarin.UITest при вызове app.Query() первый результат запроса вернет отображение устройства. Затем вы можете получить координаты XY, используя свойство Rect.

Ниже приведен пример вывода REPL, показывающий результат app.Query().First(), и пример кода, присваивающий координаты XY переменным в вашем UITest.

Пример вывода из REPL

Вывод из REPL

Образец кода

var windowQuery = app.Query().First();

var topLeftXCoordinate = windowQuery.Rect.X;
var topLeftYCoordinate = windowQuery.Rect.Y;

var topRightXCoordinate = windowQuery.Rect.X + windowQuery.Rect.Width;
var topRightYCoordinate = windowQuery.Rect.Y;

var bottomLeftXCoordinate = windowQuery.Rect.X;
var bottomLeftYCoordinate = windowQuery.Rect.Y + windowQuery.Rect.Height;

var bottomRightXCoordinate = windowQuery.Rect.X + windowQuery.Rect.Width;
var bottomRightYCoordinate = windowQuery.Rect.Y + windowQuery.Rect.Height;

var centerXCoordinate = windowQuery.Rect.CenterX;
var centerYCoordinate = windowQuery.Rect.CenterY;
person Brandon Minnick    schedule 22.12.2016

Ответ Брэндона работает хорошо, но app.Query() без предиката мучительно медленный, поскольку возвращает массив, а не IEnumerable<AppResult> — в приложении, с которым я сейчас работаю, это занимает ~10 секунд.

В качестве более быстрой альтернативы вы можете указать идентификатор автоматизации (или какой-либо другой предикат) элемента, который, как вы знаете, находится рядом с корнем. Например, если ваши представления используют ContentPage, вы можете использовать:

var content = app.Query("content").First();
var rect = content.Rect;

Это завершается менее чем за 1 с.

Обратите внимание, что это не даст вам точный размер дисплея — это размер ContentPage, поэтому он будет немного меньше, чем размер дисплея (но для моего случая использования это нормально).

person Cocowalla    schedule 30.09.2019