Tag: jsdom

为什么不用jsdom处理脚本?

在这个脚本中,HTML文档的body的onLoad属性中定义的函数不会被jsdom调用。 为什么不? var testHTML = '<html> \n' + ' <head> \n' + ' <title>AJAX Testing</title> \n' + ' <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js"></script> \n' + ' <script type="text/javascript"> \n' + ' function loaded(){ \n' + ' $("body").html("<p>AJAX was used to update the contents of this page!</p>"); \n' + ' } \n' + ' </script> \n' + ' […]

jsdom:使用jQuery将脚本附加到body

如何使用jsdom和jQuery将脚本附加到DOM主体? 使用$('body').append('<script src="…"></script>')的明显答案实际上是在文档head添加脚本。 这是我testing的基本node.js脚本: var jsdom = require('jsdom'); jsdom.env( "http://google.com", ['http://code.jquery.com/jquery-1.6.min.js'], function(err, window) { var $ = window.jQuery; $('body').append('<script src="http://example.com/script.js"></script>'); console.log($('html').html()); } ); 从而导致以下内容开始: <head><script src="http://example.com/script.js?_=1352426933034"></script>… 有趣的是,如果你在<sc ript src="…"></script>添加一个空格,那么正确的添加了一个空格,所以我想要的东西(jsdom)会劫持这个脚本,所以它可以添加cachebuster(?)把它放在标题中。 是什么原因造成的, 如何防止它发生,所以它附加脚本呢? 物有所值, $ npm ls /Users/codyaray/dev/proxy/test └─┬ jsdom@0.2.19 ├─┬ contextify@0.1.3 │ └── bindings@1.0.0 ├── cssom@0.2.5 ├── cssstyle@0.2.3 ├── htmlparser@1.7.6 └─┬ request@2.11.4 ├─┬ form-data@0.0.3 │ ├── […]

Node.io,JSDOM或PhantomJs? 或者,YQL-data.html.cssselect?

我需要抓取一个特定的网站挖掘出一些相关的信息。 看起来像首先我必须search该网站,以获得相应的url,抓取时会给我的详细信息。 我们假设,searchurl是 example.com/city1/search.html?cat=category1&locality=location1&page=1 这意味着,可以有city2,city3等类别可以是category2,category3等等,用于位置和页面。 我收集了所有的城市,类别,地点和页面可以增加,直到结果不为空。 得到所有的url后,我必须从每个url挖掘出详细的信息。 我已经看到,某些必要的信息可作为JavaScript的一部分。 现在,我已经看到了node.io,jsdom和phantomjs。 我也看到了yql。 由于我是新手,请根据您的经验向我build议,在这种情况下哪一个是最理想的。 如果你可以举一些例子,那就太棒了。

重新绑定AngularJS应用程序

目前我正在使用NodeJS和JSDOM预渲染我的服务器上的AngularJS应用程序的谷歌SEO的目的: var jsdom = require("jsdom").jsdom , document = jsdom(template) // Render Angular App angular.injector(['ng']).invoke(…) res.end(document.innerHTML) 在客户端,我有angular度的源代码,我的控制器function,完全一样的服务器上使用,而不是一个Angular模板的应用程序{{}}我有一个呈现angular度的应用程序的数据。 我希望客户端能够在服务器停止运行的情况下启动它,但是它会将其作为一个新的应用程序启动,因此我的ng-repeat所有数据都会翻倍。 我怎样才能得到Angular服务器停下来,只是重新绑定,而不是把它当作一个新的应用程序和渲染?

如何使用cheerio从网页中的换行中删除内容

祝大家好日子。 我有2个问题在使用Cheerionetworking抓取。 我经历了可能有我的答案的问题,但找不到回答我的问题的问题,于是我决定提出一个问题。 背景资料:我只学习Javascript约2〜3个月,所以我可能会问一些很有趣的问题,请原谅。 目的:我正在寻找从以下网站刮来的数据 – 我期待得到 自行车商店的名字 自行车商店的地址 自行车店的电话 我已经设法刮掉我需要的数据,但是它们是在一个HTML组中(不知道这是如何调用它,这是我使用的代码。 var request = require('request'); var cheerio = require('cheerio'); var url = 'http://www.togoparts.com/bikeshops/list_shops.php?country=MY'; request(url, function(err, resp, body) { if (err) throw err; $ = cheerio.load(body, { normalizeWhitespace: false }); var doc = $("td[width='52%'].verdana1"); doc.each(function() { var link = $(this); console.log(link.html()); }); }); 结果运行在一个循环中,我可以得到以下内容。 我无法发布图片 – […]

在Node not io.js的Mochatesting中使用jQuery

我正在运行使用jQuery(对于Ajax调用)的模块的摩卡/柴unit testing,当然,jQuery抱怨丢失的文档,因为我运行没有浏览器的testing。 我发现创build虚拟dom的jsdom模块可以欺骗jquery,但是项目已经抛弃了node.js而转向了io.js,并且不能和node一起使用。 我不认为我想在项目中间切换到io.js,所以我的问题是: 目前在命令行的摩卡testing中使用jQuery的方法是否存在?

jsdom – 运行我的摩卡testing时没有定义选项

我正在使用节点JS工具的Visual Studio 2015年,我正在写我的JavaScript和jQuery的摩卡testing,在我的本地环境我使用业力和铬运行testing,一切工作正常,但由于某种原因,我想用jsdom能够运行节点js的testing,而不使用业力或浏览器,但其中一个jquery插件内部正在做一个选项(新选项)的实例和使用jsdom我得到的参考错误选项没有从业障定义我不'吨得到任何错误,错误似乎明显业力使用一个真正的浏览器的select是定义和jsdom不是一个真正的浏览器,有什么办法使我的testing工作? 用jsdomdebuggingtesting我发现HTMLOptionElement被附加到由jsdom创build的窗口对象,但也许接口没有完全实现,这就是为什么新的选项不工作。 这是testing文件的代码 if (global.window) { window.jQuery = window.$ = require('jquery'); } else { require('jsdom-global')(); global.jQuery = global.$ = require("jquery"); } var chai = require('chai'); var assert = chai.assert; var expect = chai.expect; var should = chai.should(); chai.use(require('chai-jquery')); chai.use(require('chai-spies')); var sourceFile = require('path_to_js_file'); describe('Test', () => { it('this is not passing', () => […]

在JSDOM中加载URL时获取“拒绝访问”

我正在尝试使用jsdom.env函数来抓取页面的一些信息。 但是,在env()callback中返回的页面是关于如何拒绝服务器的访问,而不是我在浏览器中加载相同URL时希望看到的内容。 因此,浏览器如何加载页面与jsdom如何加载页面似乎有所不同。 这是可以在jsdom模块中configuration的jsdom吗? 编辑: 示例url: http://www.bestbuy.com/site/HP+-+20%22+Widescreen+Flat-Panel+LCD+Monitor/1422209.p?id=1218257754431&skuId=1422209 : http://www.bestbuy.com/site/HP+-+20%22+Widescreen+Flat-Panel+LCD+Monitor/1422209.p?id=1218257754431&skuId=1422209 1218257754431& http://www.bestbuy.com/site/HP+-+20%22+Widescreen+Flat-Panel+LCD+Monitor/1422209.p?id=1218257754431&skuId=1422209 更新: 问题是jsdom没有指定用户代理http头。 看下面的详细答案

JSDom替代与全面Sizzle支持?

对于一些范围,我有一个在CloudFoundry上运行的应用程序。 由于在这里讨论的Contextify问题,我无法使用jsdom来做到这一点。 为了解决这个问题,我开始用Cheerioreplacejsdom,但是现在我已经意识到它并不完全支持我需要用来处理被抓取的数据的Sizzleselect器。 经过一番调查,我开始觉得自己碰到了一堵砖墙 – 还有另外一个解决这个问题的方法吗? 谢谢!

如何使用Request和NodeJS到达redirect的页面

我正在使用Request,Jsdom和NodeJSlogin到网页。 根据请求API , followRedirect – 遵循HTTP 3xx响应作为redirect(默认值: true )。 这个属性也可以被实现为函数,它将响应对象作为单个参数获取,如果redirect应该继续,则返回true;否则返回false。 鉴于这是默认的,我会认为这个请求会给我redirect页面,而不是中间的redirect页面。 我的代码: request(loginPageURL, function(error, response, body) { /*Error handling removed for brevity*/ jsdom.env({ html: body, scripts: [ 'http://code.jquery.com/jquery-1.7.1.min.js' ], done: function(err, window) { //Set login fields var form = $('#authorizationForm'); var data = form.serialize(); var url = form.attr('action') || 'get'; var type = form.attr('enctype') || […]