#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()