Коснитесь определенной координаты (тесты пользовательского интерфейса)

#ios #xcode-ui-testing

#iOS #xcode-ui-тестирование

Вопрос:

Как я могу коснуться конкретной координаты с помощью UITests?

Когда я записываю нажатие на определенное место, у меня есть что-то вроде:

 XCUIApplication *app = [[XCUIApplication alloc] init];
[[[[[[[[[[app.otherElements containingType:XCUIElementTypeNavigationBar 
identifier:@"Navigation Bar title"] 
childrenMatchingType:XCUIElementTypeOther].element 
childrenMatchingType:XCUIElementTypeOther].element 
childrenMatchingType:XCUIElementTypeOther].element 
childrenMatchingType:XCUIElementTypeOther] elementBoundByIndex:0] 
childrenMatchingType:XCUIElementTypeOther].element 
childrenMatchingType:XCUIElementTypeOther] 
elementBoundByIndex:0].staticTexts[@"Action"] tap];
  

Комментарии:

1. Вам лучше разбить это на строки.

Ответ №1:

Вы можете коснуться только определенной координаты, на которую ссылается известный элемент. Это означает, что вы не можете коснуться пикселя в координатах (20, 400). Вместо этого вам нужно найти элемент, а затем нажать на что-то со смещением.

 XCUIApplication *app = [[XCUIApplication alloc] init];
XCUIElement *label = app.labels[@"Label Name"];
XCUICoordinate *coordinate = [label coordinateWithNormalizedOffset(CGVectorMake(0.5, 1.2));
[coordinate tap];
  

Я задокументировал дополнительную информацию о том, как определить правильное смещение, в моем посте с чит-листом для тестирования пользовательского интерфейса.


Если вы просто пытаетесь нажать на Action кнопку, вы можете получить к ней прямой доступ (вместо детализации всех этих запросов).

 XCUIApplication *app = [[XCUIApplication alloc] init];
[[[app.navigationBars element].staticTexts[@"Action"] tap];
  

Комментарии:

1. Сегодня я узнал, что такое нормализованное смещение. Предположим, вы нашли кнопку XYZ, затем в XYZ.coordinate(withNormalizedOffset: CGVector(dx, dy), dx, dy = 0,0 будет ее верхним левым углом. dx, dy = 1,1 будет ее нижним правым углом. dx, dy = 0,5, 0,5 будет ее серединой

2. Вы можете использовать любое значение для dx, dy за пределами 0 и 1. Просто обратите внимание, что 1dx измеряет ширину текущего элемента, на который вы ссылаетесь, а 1dy равно высоте текущего элемента, на который вы ссылаетесь. Итак, если у вас есть три кнопки одинакового размера, расположенные горизонтально рядом друг с другом, тогда leftMostButton.coordinate(withNormalizedOffset: CGVector(dx: 1.5, dy: 0.5)).tap() коснется центра средней кнопки, а dx, dy = 2.5,0.5 коснется центра средней кнопки.самая правая кнопка

Ответ №2:

Чтобы коснуться определенных координат экрана, создайте XCUICoordinate элемент из окна.

 XCUIApplication *app = [[XCUIApplication alloc] init];
XCUIElement *window = [app.windows elementAtIndex:0];
// Get co-ordinate for the top left corner of the screen
XCUICoordinate *origin = [window coordinateWithNormalizedOffset:CGVectorMake(0.0, 0.0)];
// Get coordinate relative to the top left of the screen
XCUICoordinate *myCoordinate = [origin coordinateWithOffset:CGVectorMake(40.0, 100.0)];

[coordinate tap];
  

Ответ №3:

Это быстрая версия

 let point = app.labels["labelName"].coordinate(withNormalizedOffset: CGVector(dx: 0, dy:0))
point.tap()