【问题标题】:node.js zombie.js multiple browser errorsnode.jszombie.js 多个浏览器错误
【发布时间】:2014-08-20 18:29:16
【问题描述】:

我想登录 Web 应用程序并开始模拟 - 即访问一些页面并更改一些值。

我的代码是:

var Browser = require("zombie");

fail = function (error) {console.log(error)}

function login(browser){
    //console.log("login")

    return browser.visit("http://example.com/login").then(function(){
        browser.fill('input[name="email"]', 'example@example.com')
        browser.fill('input[name="password"]', 'example')
        browser.pressButton("#login")
        return browser.wait().then(function() {
            return browser;
        })

    })
}

function simpleScenario(browser, id) {
    //browser.wait().then(function() {

        browser.visit("http://example.com/next_page")
            .then(function ()  { 
                browser.wait(function() {

                    var n = 5;
                    var step = function () { 
                        var period = 100 + n;                       

                        browser.evaluate("m.productvalue(" + period + ")");

                        if(n > 0) {
                            setTimeout(step, 1000);
                        }                    
                        n--;
                    };
                    step()

                })
                .fail(fail)
            });
    //});
}

function sampleScenario(id) {
    var browser = new Browser({debug:false})
    login(browser)
        .then(function () {
            console.log("logged in");
            simpleScenario(browser, id);
        })
        .fail(fail);
}

function loadTest(numberOfThreads) {
    for(i = 0; i < numberOfThreads; i++) {
        sampleScenario(i)
    }
}

loadTest(50);

我的问题是:当我在循环中执行一次函数时,一切正常,但是当 numberOfThreads 为 10 或更多时,我收到错误:
[TypeError:无法使用 'in' 运算符在 null 中搜索 'compareDocumentPosition']
似乎如果创建了许多 Browser 对象,那么僵尸无法管理它。 也许僵尸库太慢而无法处理多个线程?我可以在不使用 Zombie.js 的情况下仅使用 node.js 做同样的事情吗?或者也许我的脚本的某些部分需要优化以与 Zombie.js 一起运行?

【问题讨论】:

    标签: node.js browser zombie.js


    【解决方案1】:

    错误信息[TypeError: Cannot use 'in' operator to search for 'compareDocumentPosition' in null]表示zombie尝试将响应内容加载到Document对象中,但响应内容为null,表示内容尚未响应。

    请注意,您的 login 函数并非旨在正确处理登录过程,因为无法衡量登录是否成功。至少您应该在wait 函数中添加一些内容:

    function login(browser) {
    
        return browser.visit('http://example.com/login').then(function() {
            browser.fill('input[name="email"]', 'example@example.com')
                .fill('input[name="password"]', 'example')
                .pressButton("#login").then(function() {
                    // check if h1 tag is there in 7 seconds.
                    return browser.wait({waitDuration: '7s', element: "h1"});
                });
        })
    }
    

    根据您的simpleScenario,它必须在wait 中返回非虚假值。否则僵尸会一直等到 5 秒。

    【讨论】:

      【解决方案2】:

      我也有类似的问题,通过在创建浏览器实例时删除调试选项得到了解决。 也降级到 v1.4.1,因为 2.0 处于 alpha 阶段

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-24
        • 2014-02-17
        • 1970-01-01
        • 1970-01-01
        • 2018-08-17
        • 2018-06-22
        • 1970-01-01
        相关资源
        最近更新 更多