标签: jsdom

使用jsdom和node.js发布表单

我正在使用jsdom,jquery和node.js来抓取网站.有什么办法可以发布一个表单并使用jsdom获取生成的下一页窗口.

这是代码

var httpAgent = require('http-agent'),
    jsdom = require('jsdom'),
    request = require('request');

request({uri:'http://www.orbitz.com'}, function(error, response, body){
  if(error && response.statusCode != 200)
    console.log('Error on request');

  jsdom.env({
    html: body,
      scripts : [
        'http://code.jquery.com/jquery-1.5.min.js'
      ]
    }, function(err, window) {
          var $ = window.jQuery;

          $('#airOneWay').attr('checked', true);
          $('#airRoundTrip').removeAttr('checked');
          $('#airOrigin').val('ATL');
          $('#airDestination').val('CHI');

          // here we need to submit the form $('#airbotForm') and get the resulting window
          //console.log($('#airbotForm').html());
   });
});
Run Code Online (Sandbox Code Playgroud)

这是需要提交的表单,$('#airbotForm')必须捕获生成的页面.

有人可以帮忙吗?谢谢

jquery node.js jsdom

10
推荐指数
1
解决办法
5863
查看次数

Node.js - 如何编辑jsdom窗口中的元素并将窗口另存为新的HTML文件?

我想加载一个HTML文件(使用fs.read),使用jsdom加载DOM,然后更改正文节点的文本(通过jquery).然后我想将编辑后的DOM窗口保存为HTML文件.有没有办法做到这一点?我使用的代码如下:

fs.readFile(file, 'utf8', function(error, data) {
    jsdom.env(data, [], function (errors, window) {
        var $ = require('jquery')(window);
        $(document.body.getElementsByTagName("*")).each(function () {
            var content = $(this).text();
            var word = "\\b"+wordSuggestions.word+"\\b";
            var re = new RegExp(word, "g");
            content = content.replace(re, wordSuggestions.suggestion);
            $(this).text(content);
        });

        fs.writeFile(file, data, function (error){ // saving the new HTML file? What should I put instead of data? Window?
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

html javascript jquery node.js jsdom

10
推荐指数
1
解决办法
6738
查看次数

nodeJS中的JSDOM:如何取回被操纵的html?

我试图操纵远程HTML并返回它操纵.我决定使用JSDOM,但无法弄清楚如何获取被操纵的HTML.有任何想法吗?

  jsdom.env({
        url: "http://www.cnn.com",
        scripts: ["http://code.jquery.com/jquery.js"],
        done: function (err, window) {
            var $ = window.$;
            console.log("HN Links");
            var src = $(".ghciTopStoryImage1 img").attr('src','http://lorempixel.com/396/220/');
            var headline = $(".blkbigheader span").html('header');
            var description = $(".blkbigheader").parent().find("p a:eq(0)").html('text');

           // not working....
            content =$(window.document).html();

        }
    });
Run Code Online (Sandbox Code Playgroud)

javascript node.js jsdom

10
推荐指数
2
解决办法
1万
查看次数

用jsdom开玩笑,文档在Promise解析中未定义

场景

尝试使用Jest(和Enzyme)测试一个简单的React组件.这个组件使用react-dropzone,我想测试一些涉及DOM的操作,所以我使用jsdom(已经配置create-react-app)

问题

document在我的测试代码中可用但在组件内部可用的对象undefined位于dropzone onDrop回调内部,这会阻止测试运行.

代码

MyDropzone

import React from 'react'
import Dropzone from 'react-dropzone'

const MyDropzone = () => {
    const onDrop = ( files ) =>{
        fileToBase64({file: files[0]})
            .then(base64Url => {
                return resizeBase64Img({base64Url})
            })
            .then( resizedURL => {
                console.log(resizedURL.substr(0, 50))
            })
    }
    return (
        <div>
            <Dropzone onDrop={onDrop}>
                Some text
            </Dropzone>
        </div>
    );
};

const fileToBase64 = ({file}) => {
    return new Promise((resolve, reject) => {
        const reader = new FileReader() …
Run Code Online (Sandbox Code Playgroud)

javascript jsdom reactjs jestjs enzyme

10
推荐指数
1
解决办法
2210
查看次数

node.js上的jsdom + canvas:toDataURL()错误

使用canvas@1.2.3和jsdom@3.1.2与节点v0.12.2,我在尝试使用canvas toDataURL()函数时遇到错误.

canvasTest.js:

$(function(){
  var canvas = $('<canvas></canvas>').attr({'id':'canvasTest', 'width':'500', 'height':'500'});

  var ctx=canvas[0].getContext("2d");
  ctx.beginPath();
  ctx.arc(100,75,50,0,2*Math.PI);
  ctx.stroke();

  $('#canvasWrap').append(canvas);
});
Run Code Online (Sandbox Code Playgroud)

HTML测试:

<!doctype html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="canvasTest.js"></script>
<script type="text/javascript">
$(function(){
  console.log($('body').html());
  console.log($('#canvasTest').length);
  console.log($('#canvasTest')[0].toDataURL());
})
</script>
</head>
<body>
<div id="canvasWrap"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

jsdom测试:

var canvas = require('canvas');
var jsdom = require('jsdom');

jsdom.env({
  html: '<html><body><div id="canvasWrap"></div></body></html>',
  scripts: ['127.0.0.1/jquery-2.1.4.min.js','127.0.0.1/canvasTest.js'],
  done:function (err,win) {
    var $ = win.jQuery;
    $(function(){
      console.log($('body').html());
      console.log($('#canvasTest').length);
      console.log($('#canvasTest')[0].toDataURL());
    });
  }
});
Run Code Online (Sandbox Code Playgroud)

在我在Chrome中的HTML测试中,我获得了正确的base64编码的画布数据,而在node.js中,错误如下:

TypeError: Cannot read property 'toDataURL' of undefined
Run Code Online (Sandbox Code Playgroud)

canvas node.js jsdom

9
推荐指数
1
解决办法
1206
查看次数

mocha + jsdom + React TypeError:无法读取未定义的属性'addEventListener'

我刚开始使用mocha 2.3.3,jsdom 6.5.1和Node.js 4.1.1对React 0.10.0组件进行单元测试.我有这个用于我的单元测试:

var React = require('react/addons');
var TestUtils = React.addons.TestUtils;
var sinon = require('sinon');
var expect = require('chai').expect;
var jsdom = require('jsdom');
var view = require('../student-name-view.js');

describe('The student name view', function() {

    var renderedComponent = null;
    var nameChangedStub = sinon.stub();
    var nameSubmittedStub = sinon.stub();

    before(function() {
        global.document = jsdom.jsdom('<!doctype html><html><body></body></html>');
        global.window = document.parentWindow;
        this.renderedComponent = TestUtils.renderIntoDocument(
            view({
                nameChanged:   nameChangedStub,
                nameSubmitted: nameSubmittedStub
            })
        );
        this.nameInput = TestUtils.findRenderedDOMComponentWithTag(renderedComponent, 'input').getDOMNode();
    });

    describe('should notify the controller', function() {

        it('when the name …
Run Code Online (Sandbox Code Playgroud)

mocha.js jsdom reactjs

9
推荐指数
1
解决办法
8374
查看次数

Vitest 配置未检测到 jsdom 环境

我在 Vite/React/TypeScript 应用程序中,正在使用 Vitest 配置我的第一个测试。

当我运行 Button 测试 (yarn vitest) 时,出现以下错误:

packages/frontend/src/components/Generic/Button/Button.test.tsx > Button > should render the button
ReferenceError: document is not defined
Run Code Online (Sandbox Code Playgroud)

据我所知,Vitest 不能与 JSDom 一起使用。我尝试过几件事:

  • KO:在 vite.config.ts 文件中指定使用 JSDom
  • OK:添加 vitest.config.ts 文件指定使用 JSDom
  • OK:在测试文件顶部添加注释(@vitest-environment jsdom)

我更喜欢使用第一个选项(使用 vite.config.ts)来仅共享一个配置。是否可以 ?


注 1:我已经安装的 JSdom 有“devDependency”。注 2:要使用 vitest.config.ts,我应该像这样更新 package.json 中的脚本: "test": "vitest --config ./packages/frontend/vitest.config.ts"

这是我的文件:

// vite.config.ts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import viteTsConfigPaths from 'vite-tsconfig-paths'
import tailwindcss from 'tailwindcss'

export default defineConfig({
  server: {
    port: …
Run Code Online (Sandbox Code Playgroud)

jsdom typescript reactjs vite vitest

9
推荐指数
0
解决办法
5050
查看次数

jsdom:dispatchEvent/addEventListener似乎不起作用

摘要:

我试图测试一个侦听其中的本机DOM事件的React组件componentWillMount.

我发现jsdom(@8.4.0)在调度事件和添加事件监听器时没有按预期工作.

我可以提取的最简单的代码:

window.addEventListener('click', () => {
  throw new Error("success")
})

const event = new Event('click')
document.dispatchEvent(event)

throw new Error('failure')
Run Code Online (Sandbox Code Playgroud)

这引发了"失败".


语境:

如果上述问题存在XY问题,我想提供更多背景信息.

这是我试图测试的组件的提取/简化版本.你可以在Webpackbin上看到它.

import React from 'react'

export default class Example extends React.Component {
  constructor() {
    super()
    this._onDocumentClick = this._onDocumentClick.bind(this)
  }

  componentWillMount() {
    this.setState({ clicked: false })
    window.addEventListener('click', this._onDocumentClick)
  }

  _onDocumentClick() {
    const clicked = this.state.clicked || false
    this.setState({ clicked: !clicked })
  }


  render() {
    return <p>{JSON.stringify(this.state.clicked)}</p>
  }
} …
Run Code Online (Sandbox Code Playgroud)

javascript testing jsdom

8
推荐指数
2
解决办法
1万
查看次数

使用jsdom,sinon,mocha和chai测试Image onload

任何人都可以帮我测试以下功能

function onload(cb){
  const image = 'http://placehold.it/350x150'
  const img = new Image()
  img.src = image
  img.onload = () => {
    cb()
  }
}
Run Code Online (Sandbox Code Playgroud)

在我的测试文件Image中可以通过jsdom获得.我想我可以测试那个cb叫做一次

javascript unit-testing jsdom sinon-chai

8
推荐指数
1
解决办法
1891
查看次数

Tab 按键不会改变焦点元素

我正在创建一个基于用户键盘事件(如按 Enter、箭头等)处理焦点的组件。

最好测试该组件是否忽略了 keydown 上的 tab 键。

但是,在触发 keydown tab 事件时,焦点不会像在浏览器中那样改变。


鉴于反应组件 Component.js

import React from 'react'

export default () => (
  <>
    <button data-testid="one">
      one
    </button>
    <button data-testid="two">
      two
    </button>
  </>
)
Run Code Online (Sandbox Code Playgroud)

和下面的测试 Component.test.js

import React from 'react'
import 'jest-dom/extend-expect'
import { cleanup, fireEvent, render, wait } from 'react-testing-library'
import Component from './Component'

afterEach(cleanup)

it('changes focus on tab', async () => {
  const { getByTestId } = render(<Component />)
  const one = getByTestId('one')
  const two = getByTestId('two')

  one.focus()

  expect(one).toHaveFocus() …
Run Code Online (Sandbox Code Playgroud)

javascript jsdom reactjs jestjs react-testing-library

8
推荐指数
1
解决办法
3781
查看次数