Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用Node.js模拟移动环境?_Javascript_Node.js_Mobile - Fatal编程技术网

Javascript 如何使用Node.js模拟移动环境?

Javascript 如何使用Node.js模拟移动环境?,javascript,node.js,mobile,Javascript,Node.js,Mobile,我想使用Node.js模拟移动浏览器,这意味着所有移动浏览器功能都应该在JavaScript端(客户端)可用,即使它们被模拟 网页应该认为它们是在移动环境中加载的。例如,如果我们有一个网页,上面写着: if ('ontouchstart' in window) { document.body.innerHTML = "Mobile"; } else { document.body.innerHTML = "Not mobile"; } …然后在模拟中加载页面时,正文内容应为Mobile

我想使用
Node.js
模拟移动浏览器,这意味着所有移动浏览器功能都应该在
JavaScript
端(客户端)可用,即使它们被模拟

网页应该认为它们是在移动环境中加载的。例如,如果我们有一个网页,上面写着:

if ('ontouchstart' in window) {
  document.body.innerHTML = "Mobile";
} else {
  document.body.innerHTML = "Not mobile";
}
…然后在模拟中加载页面时,正文内容应为
Mobile

正确的方法是什么?我会避免简单地使用PhantomJS(或任何类似的)并执行一个脚本,该脚本将:

window.ontouchstart = function () {};
我想使用,但似乎没有简单的方法可以简单地说
mobile:true
,这将添加所有这些属性

创建一个将这些
API
s暴露出来的浏览器的最佳方法是什么,模拟移动浏览器

更好的例子 在Node.js方面,我希望与浏览器仿真进行通信,并获得一些结果。假设我们有一个
index.html
页面,如下所示:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8">
    </head>
    <body>
        <script>
        if ('ontouchstart' in window && window.orientation) {
          document.body.innerHTML = "Mobile";
        } else {
          document.body.innerHTML = "Not mobile";
        }
        </script>
    </body>
</html>
这将输出
而不是mobile
,而用户代理是我提供的(iphone6)。预计将是
Mobile


它只是显示了
窗口。方向
不可用,因为它不是移动浏览器。

正如您提到的Phantom and Horseman,我相信您需要一个支持移动的浏览器自动化框架。您可以将selenium与chrome(ChromeDriver)一起使用,而不是使用Phantom,chrome支持移动仿真

在这里,您可以找到selenium client for NodeJS: 铬驱动程序:

在移动仿真模式下启动chrome:

var webdriver = require('selenium-webdriver');
var capabilities = {
    browserName: 'chrome',
    chromeOptions: {
        mobileEmulation: {
            deviceName: 'Apple iPhone 6'
        }
    }
};

var driver = new webdriver
    .Builder()
    .withCapabilities(capabilities)
    .build();
您可以在此处找到可用设备的列表:

您还可以定义自定义设备:

如果您希望它无头,最新的chrome版本支持它:

您还可以使用selenium在真正的android设备或模拟器上运行测试:

只是2021年的更新:

要在selenium webdriver中使用仿真模式,现在正确的方法是:

var webdriver = require('selenium-webdriver'),

var driver = new webdriver.Builder()
.forBrowser('chrome')
.setChromeOptions(new chrome.Options()
.setMobileEmulation({deviceName: 'Apple iPhone 5'})
//.setMobileEmulation({deviceName: ‘Pixel 2 XL’})         //<--- tested
//.setMobileEmulation({deviceName: ‘Google Nexus 7’})
//.addArguments('start-maximized')
)
.build();

//Rest of the operations will be done in emulation mode
// this links shows what user agent you are currently using
driver.get('https://www.whatismybrowser.com/detect/what-is-my-user-agent');

driver.quit();
var webdriver=require('selenium-webdriver'),
var driver=new webdriver.Builder()
.forBrowser('chrome')
.setChromeOptions(新的chrome.Options()
.setMobileEmulation({deviceName:'Apple iPhone 5'})

//.setMobileEmulation({deviceName:'Pixel 2 XL'})//你说你想让node.js模拟移动浏览器是什么意思?因为node.js通常是等式的服务器端,所以不清楚你想做什么?你是说你想用node.js向其他站点发出请求,而你想让其他站点认为请求来自你的node.jsapp是一款移动浏览器?@jfriend00完全正确!一般来说,对于普通浏览器,我一直在使用PhantomJS和Electron,但为了模拟移动环境,我不知道什么是最好的方式。请编辑您的问题,以更清楚地说明您正试图做什么。@jfriend00我添加了一个小示例。简言之:我想看看您的想法通过移动浏览器加载页面的ppens,但从Node.js执行此操作(显然只是模拟功能)还有,当你说模拟一个移动浏览器时,你想用这个模拟来完成什么?担心窗口中的
“ontouchstart”之类的事情
是客户端检测,只有当你真的要运行移动页面中返回的javascript时才相关。你想这么做吗?如果你只是想要服务的话r如果您向thinkk发出请求,并且它正在为移动浏览器提供页面,那么您可能只需要在请求上设置正确的标题(例如用户代理)并支持cookie(如果站点cookie认为您是移动的)。这看起来不错,但我担心这在没有GUI的服务器上不起作用。@IonicăBizău,正如我提到的,你可以在无头模式下运行chrome:那就更好了!有可能以类似的方式在无头模式下运行Android吗?谢谢!@IonicăBizău你可以在无头模式下运行Android模拟器,然后使用selenium!连接到它的chrome你能添加设置这个环境的步骤吗?听起来不是一个简单的任务,这篇文章已经发表了4年了。
var webdriver = require('selenium-webdriver'),

var driver = new webdriver.Builder()
.forBrowser('chrome')
.setChromeOptions(new chrome.Options()
.setMobileEmulation({deviceName: 'Apple iPhone 5'})
//.setMobileEmulation({deviceName: ‘Pixel 2 XL’})         //<--- tested
//.setMobileEmulation({deviceName: ‘Google Nexus 7’})
//.addArguments('start-maximized')
)
.build();

//Rest of the operations will be done in emulation mode
// this links shows what user agent you are currently using
driver.get('https://www.whatismybrowser.com/detect/what-is-my-user-agent');

driver.quit();