iOS自动化测试iOS Developer赏味不足

UITesting深入测试

2016-12-15  本文已影响445人  沈宥

1、物理按键


屏幕显示选择项
    XCUIDevice *device = [XCUIDevice sharedDevice];
    
    //Home键
    [device pressButton:XCUIDeviceButtonHome];
    
    //音量键
    [device pressButton:XCUIDeviceButtonVolumeUp];
    [device pressButton:XCUIDeviceButtonVolumeDown];
    
    UIDeviceOrientation orientation = device.orientation;
    
    //将画面转成直向 Portrait
    device.orientation = UIDeviceOrientationPortrait;
    
    //将画面转成直向 Portrait Upside Down
    device.orientation = UIDeviceOrientationPortraitUpsideDown;
    
    //将画面转成横向 Landscape Left
    device.orientation = UIDeviceOrientationLandscapeLeft;
    
    //将画面转成横 Landscape Right
    device.orientation = UIDeviceOrientationLandscapeRight;

2、判断是否可点击

XCUIElement *tabLiveButton =  tabBarsQuery.buttons[@"tab live"];
//是否存在
BOOL exists = tabLiveButton.exists;
//是否可见
BOOL hittable = tabLiveButton.hittable;

3、CollectionView滑动操作

  XCUIApplication *application = [[XCUIApplication alloc] init];
 
 // 找到当前界面上所有的collectionView   
  XCUIElementQuery *collectionViewsQuery = application.collectionViews;
  NSInteger queryCount = collectionViewsQuery.count;
  
  //给出一个frame,用来匹配想要操作的collectionView
    CGRect colletionFrame = CGRectMake(0, 64, 375.0, 667.0 - 64);
    
    for (int i = 0; i < queryCount; i++) {
        XCUIElement *collection = collectionViewsQuery.allElementsBoundByIndex[i];
        
        CGRect tempFrame = collection.frame;
        
        if (CGRectContainsRect(colletionFrame, tempFrame) && [collection canOperateElement]) {
            self.collectionView = collection;            
        }
    }
  //滑动操作
   [self.collectionView swipeUp];
   [self.collectionView swipeDown];

4、cell查找并点击

  //当前找到的collectionView中的cell
    self.cells = [self.collectionView descendantsMatchingType:XCUIElementTypeCell];
    NSInteger cellCount = self.cells.count;
    if (cellCount > 0) {        
        XCUIElement *lastCell = self.cells.allElementsBoundByIndex[cellCount -1];
        //滑动到最后
        if ([self.collectionView canOperateElement]) {
        XCUIElement *lastCell = self.cells.allElementsBoundByIndex[cellCount -1];
        //这里应该还有个滑动查找的过程,后续讲解
        if ([lastCell canOperateElement]) {
            //进行点击操作
            [lastCell tap];
        }
    }

5、UITesting框架中提供的wait方法:

- (void)waitForExpectationsWithTimeout:(NSTimeInterval)timeout handler:(nullable XCWaitCompletionHandler)handler;

默认是在一定时间内查找控件失败后,即结束整个测试;这里提供另一种手动运行循环方式,反复运行断言

    XCUIApplication *app = [[XCUIApplication alloc] init];
    XCUIElement *splash = app.otherElements[@"splash viewcontroller"];
    
    NSTimeInterval startTime = [NSDate timeIntervalSinceReferenceDate];
    NSInteger loopDuration = [NSDate timeIntervalSinceReferenceDate] - startTime;
   
    while (!splash.exists || loopDuration < 2.0) {
        splash = app.otherElements[@"splash viewcontroller"];
        loopDuration = [NSDate timeIntervalSinceReferenceDate] - startTime;
        CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.5, NO);
    }

备注:上为每0.5判断一次是否存在splash viewcontroller;若超过2s仍未找到该页面,则停止循环查找

6、点击某一个具体的坐标点。由于UITesting Bundle未提供点击左边的相关API,这里给出曲线救国方式:

- (void)customTapElementAtPoint:(CGPoint)point pressDuration:(NSTimeInterval)duration{
    //CGVectorMake(0.0, 0.0) screen origin
    //dx: 0.0, dy: 0.0 - The "-10" means scroll 10 points down.
    XCUICoordinate *coordinate = [self coordinateWithNormalizedOffset:CGVectorMake(0, 0)];
    [[coordinate coordinateWithOffset:CGVectorMake(point.x, point.y) ] pressForDuration:duration];
}

备注:根据API Refrence提供的文档,对上述方法加以解释

(1)- (XCUICoordinate *)coordinateWithNormalizedOffset:(CGVector)normalizedOffset;
这里得到的坐标为:
x = element.frame.x * 0;
y = element.frame.y * 0;

(2)- (XCUICoordinate *)coordinateWithOffset:(CGVector)offsetVector;
在上面已经得到的坐标(也就是屏幕的原点(0,0))基础上,偏移point的位置,得到需要点击的坐标点。
需要注意的是,这里的偏移量是以element的坐标原点为基准。比如,element的原坐标为(100,100),想要的偏移量为point(20,20),最终点击的坐标点即为:(120,120)

7、录制时生成代码如下:
[app.alerts[@"\U8981\U56de\U5230\U62cd\U6444\U9875\U9762\U5417\Uff1f"].buttons[@"\U786e\U5b9a"] tap];
这里报错是因为元素的中文字符取的是其unicode编码,碰到这种情况,需要手动修正下代码,改为中文即可。

8、报错:
Failed to load test bundle from file:///Users/dongmeiliang/Library/Developer/Xcode/DerivedData/JSQMessages-axyqhmblkssajpgcyzizcquhltft/Build/Products/Debug-iphonesimulator/JSQMessages.app/PlugIns/JSQMessagesTests.xctest/../JSQMessagesTests.xctest/: Error Domain=NSCocoaErrorDomain Code=4 "The bundle “$(PRODUCT_NAME)” couldn’t be loaded because its executable couldn’t be located." UserInfo={NSLocalizedFailureReason=The bundle’s executable couldn’t be located., NSLocalizedRecoverySuggestion=Try reinstalling the bundle., NSBundlePath=/Users/dongmeiliang/Library/Developer/Xcode/DerivedData/JSQMessages-axyqhmblkssajpgcyzizcquhltft/Build/Products/Debug-iphonesimulator/JSQMessages.app/PlugIns/JSQMessagesTests.xctest, NSLocalizedDescription=The bundle “$(PRODUCT_NAME)” couldn’t be loaded because its executable couldn’t be located.}

修改:
Tests target > info.plist > delete the row Bundle name $(PRODUCT_NAME)

9、报错:
The bundle UITesting couldn’t be loaded because its executable couldn’t be located. Try reinstalling the bundle.

方法:
http://stackoverflow.com/questions/34704388/xctest-error-the-bundle-couldn-t-be-loaded-try-reinstalling-the-bundle

上一篇下一篇

猜你喜欢

热点阅读