我如何通过浏览器控制移动设备屏幕?

10

更新
参考资料: 完美移动设备任意处


我正在研究一种基于云的移动测试解决方案,应支持iOS和Android。它需要从浏览器处理连接的移动设备。
我了解到移动设备安装了一种代理程序(需要对设备进行root),它可以:
- 将移动屏幕流式传输到浏览器中 - 注入事件 是否有其他方法可以在不进行root或越狱设备的情况下实现此目标? 这个问题可能看起来很广泛,但我一直在努力找出正确的方向。
对于iOS,我从this SOF question中得到了线索。
感谢任何指针。

更新 1:
这个问题接近我所寻求的内容。

更新 2: 我已经找到了适用于 Android 设备的 Android 屏幕库,并在几个设备上进行了测试。它不需要设备被 root,但需要在每次设备重新启动时从命令行重启服务,而且无法在 Lollipop 上使用。

更新 3: 虽然Android 屏幕库有助于捕获屏幕而无需 root,但它无法帮助注入事件。即使屏幕截图看起来有点问题 - 有时会出现黑色补丁,并且无法在 Lollipop 上使用!

更新4: 参考链接:完美移动设备任意 看起来他们正在使用ADB来处理许多事情,例如应用程序的安装/卸载,通过adb shell input tap x y发送事件。有人能否请解释一下?

更新5: 我发现了这篇SO帖子,来自前RealVnC工程师Adrian Taylor。这是最详细的解释。虽然Android Lollipop有MediaProjection API,但似乎会将截屏存储为sdcard上的MP4文件。此外,根据谷歌仪表板 - 2015年8月的更新,Lollipop仍占Android安装基数的约15%,因此需要考虑Kitkat作为任何解决方案。

更新6: 我发现了libvncserver,想知道它是否能胜任这项工作。我会测试并发布结果。

谢谢


1
请在您的反对意见中添加评论;这将有助于我。 - iuq
我不确定这是否是您要寻找的,但您可以使用JavaScript自动化UI测试。教程文档 - Islam
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - iuq
1个回答

4
使用WebKit,这将使您几乎尽可能接近且仍然很有可能通过苹果的批准流程。
这是一个简单的示例,基本上在网页上创建一个选择器,将字符串值发送给我在应用程序中,您处理该值并发送回结果,然后将其发布为网页的标题。
<h2 id="headline">loading...</h2>
<select id="selector">
    <option value="systemVersion" selected>iOS Version</option>
    <option value="systemName">System Name</option>
    <option value="name">Device Name</option>
    <option value="model">Device Model</option>
    <option value="userInterfaceIdiom">User Interface</option>
    <option value="identifierForVendor">Vendor ID</option>
</select>

这是 JavaScript 代码:
var headline = $("#headline");
var selection = $("#selector");

function set_headline (text) {
    headline.text(text);
}

function call_native () {
    var prop = selection.val();
    set_headline("asked for " + prop + "...");
    window.webkit.messageHandlers.observe.postMessage(prop);
}

setTimeout(call_native, 1000);
selection.on("change", call_native);

在应用程序结束时,您需要进行以下设置:
//配置webView并将其放置在屏幕上
[controller addScriptMessageHandler:self name:@"observe"];
configuration.userContentController = controller;
NSURL *jsbin = [NSURL URLWithString:k_JSBIN_URL];

_webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:configuration];
[_webView loadRequest:[NSURLRequest requestWithURL:jsbin]];
[self.view addSubview:_webView];

处理 webView 事件:
-(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
// Check to make sure the name is correct
    if ([message.name isEqualToString:@"observe"]) {
        // Log the message received
        NSLog(@"Received event %@", message.body);

        // Then pull something from the device using the message body
        NSString *version = [[UIDevice currentDevice] valueForKey:message.body];

        // Execute some JavaScript using the result
        NSString *exec_template = @"set_headline(\"received: %@\");";
        NSString *exec = [NSString stringWithFormat:exec_template, version];
        [_webView evaluateJavaScript:exec completionHandler:nil];
    }
}

感谢您的回复。这个方法只适用于Web/Hybrid应用程序还是原生应用程序也可以使用?抱歉,我还没有在iOS上测试过任何东西,因为我仍在努力解决Android的解决方案。 - iuq
这是纯本地的,不是混合的,在这种情况下全部都是针对 ObjC 的,所以非常强大。 - Larry Pickles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接