javascript - 从 iOS UIAutomation 发出同步 HTTP GET 请求或调用 JavaScript 中的 shell 脚本

标签 javascript iphone ios integration-testing ios-ui-automation

我正在尝试使用 Apple 的 UIAutomation 为具有服务器端组件的 iOS 应用程序编写单元测试。为了在各种状态下设置测试服务器(以及模拟两个客户端通过我的服务器进行通信),我想从基于 javascript 的测试中发出 HTTP get 请求。

谁能提供一个示例,说明如何直接从 UIAutomation javascript 测试中发出 HTTP GET 请求,或者如何从我的 UIAutomation javascript 测试中调用 shell 脚本?

FWIW,大多数浏览器可用的核心对象在 UIAutomation 运行时中都缺失了。例如,尝试使用 XMLHTTPRequest,您将收到一个异常报告,它无法找到该变量。

谢谢!

最佳答案

各位,

我能够通过向 iOS 客户端发送 HTTP 请求来处理并在 UIAlertView 中返回结果来解决这个问题。请注意,所有 iOS 代码修改都包含在 #if DEBUG 条件编译指令中。

首先,将您的客户端设置为在设备摇晃时发送通知。 Read this post for more information .

接下来,在您的 iOS 主应用委托(delegate)中添加此代码:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(deviceShakenShowDebug:)
                                             name:@"DeviceShaken" 
                                           object:nil];

然后添加一个看起来像这样的方法:

- (void) deviceShakenShowDebug:(id)sender
{
    if (!self.textFieldEnterDebugArgs)
    {
        self.textFieldEnterDebugArgs = [[[UITextField alloc] initWithFrame:CGRectMake(0, 0, 260.0, 25.0)] autorelease];
        self.textFieldEnterDebugArgs.accessibilityLabel = @"AlertDebugArgsField";
        self.textFieldEnterDebugArgs.isAccessibilityElement = YES;
        [self.textFieldEnterDebugArgs setBackgroundColor:[UIColor whiteColor]];
        [self.tabBarController.selectedViewController.view addSubview:self.textFieldEnterDebugArgs];
        [self.tabBarController.selectedViewController.view bringSubviewToFront:self.textFieldEnterDebugArgs];
    }
    else
    {
        if ([self.textFieldEnterDebugArgs.text length] > 0)
        {
            if ([self.textFieldEnterDebugArgs.text hasPrefix:@"http://"])
            {
                [self doDebugHttpRequest:self.textFieldEnterDebugArgs.text];    
            }
        }
    }
}

- (void)requestDidFinishLoad:(TTURLRequest*)request
{
        NSString *response = [[[NSString alloc] initWithData:((TTURLDataResponse*)request.response).data 
                                                    encoding:NSUTF8StringEncoding] autorelease];

        UIAlertView *resultAlert = 
            [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Request Loaded",@"")
                                       message:response
                                      delegate:nil
                             cancelButtonTitle:NSLocalizedString(@"OK",@"")
                             otherButtonTitles:nil] autorelease];
        resultAlert.accessibilityLabel = @"AlertDebugResult";
        [resultAlert show];
}

此代码将在摇晃后将 UITextField 添加到最顶层的 View Controller ,在任何导航栏或其他 UI 元素的正上方拍打。 UIAutomation 或您作为用户,可以手动将 URL 输入到此 UITextField 中。当你再次摇动设备时,如果文本以“http”开头,它会在代码中发出 HTTP 请求(练习读者实现 doDebugHttpRequest)。

然后,在我的 UIAutomation JavaScript 文件中,我定义了以下两个函数:

function httpGet(url, delayInSec) {
  if (!delayInSec) delay = 1;
  var alertDebugResultSeen = false;
  var httpResponseValue = null;

  UIATarget.onAlert = function onAlert(alert) {    
    httpResponseValue = alert.staticTexts().toArray()[1].name();
    alert.buttons()[0].tap();
    alertDebugResultSeen = true;
  }

  var target = UIATarget.localTarget();
  var application = target.frontMostApp();
  target.shake(); // bring up the input field
  application.mainWindow().textFields()["AlertDebugArgsField"].setValue(url);
  target.shake(); // send back to be processed
  target.delay(delayInSec);
  assertTrue(alertDebugResultSeen);
  return httpResponseValue;
}

function httpGetJSON(url, delayInSec) {
  var response = httpGet(url, delayInSec);
  return eval('(' + response + ')');
}

现在,在我的 javascript 文件中,我可以调用

httpGet('http://localhost:3000/do_something')

然后它将执行 HTTP 请求。如果我想从服务器返回 JSON 数据,我调用

var jsonResponse = httpGetJSON('http://localhost:3000/do_something')

如果我知道这将是一个长时间运行的调用,我会调用

var jsonResponse = httpGetJSON('http://localhost:3000/do_something', 10 /* timeout */)

几周以来,我一直在成功地使用这种方法。

关于javascript - 从 iOS UIAutomation 发出同步 HTTP GET 请求或调用 JavaScript 中的 shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6191814/

相关文章:

javascript - 尝试使用 LiveScript 理解 Maybe Monad

ios - 如何在 iOS 应用程序中停止 captureOutput

ios - 从 firebase 读取数据并填充 TableViewCell

ios - skspritenode 颜色属性仅在第一个实例中设置

javascript - 隐藏元素不会复制到剪贴板

javascript - React JS + Material UI 抛出 leftNav 未定义

iphone - 键盘通知未正确触发

iphone - Cocos2d/Box2d CCRibbon 碰撞检测

iphone - 滚动 - 从图像创建缩略图

javascript - 在多个地方使用相同的随机数 (JavaScript)