javascript - PhantomJS 无法访问已删除 QObject 的成员 'evaluate'

标签 javascript phantomjs

function checkMessages(user, password, callback) {  
    var page = require('webpage').create();  
    page.open('http://mywebpage.com', function (status) {  
        if (status === 'fail') {  
            console.log(user + ': ?');  
        } else {  
            page.evaluate(function (user, password) {  
                document.querySelector('input[name=username]').value = user;  
                document.querySelector('input[name=password]').value = password;  
                document.querySelector('button[name=yt0]').click();  
            }, user, password);  
            waitFor(function() {  
                return page.evaluate(function() {  
                    var el = document.getElementById('fancybox-wrap');  
                    if (typeof(el) != 'undefined' && el != null) {  
                        return true;  
                    }  
                    return false;  
                });  
            }, function() {  
                var messageCount = page.evaluate(function() {  
                    var el = document.querySelector('span[class=unread-number]');  
                    if (typeof(el) != 'undefined' && el != null) {  
                        return el.innerText;  
                    }  
                    return 0;  
                });  
                console.log(messageCount);  
            });  
        }  
        page.close();  
        callback.apply();  
    });
}

出于某种原因,我无法让它工作。 PhantomJS 提示:“错误:无法访问已删除 QObject 的成员‘评估’”。是因为我有多个 page.evaluates 吗?

最佳答案

PhantomJS 是异步的。在这种情况下,waitFor() 是异步的,因此您需要在完成后关闭page。你需要移动

page.close();
callback.apply();

进入将要执行的最后一个函数,即waitFor()的回调。您可能需要稍微更改 waitFor ,以便在达到超时时有另一个回调,这是错误分支,也需要页面关闭和回调:

function waitFor(testFx, onReady, timeOutMillis) {
    var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 3000,
        start = new Date().getTime(),
        condition = false,
        interval = setInterval(function() {
            if ( (new Date().getTime() - start < maxtimeOutMillis) && !condition ) {
                condition = testFx();
            } else {
                var error = null;
                if(!condition) {
                    error = "'waitFor()' timeout";
                    console.log(error);
                } else {
                    console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms.");
                    clearInterval(interval);
                }
                onReady(error);
            }
        }, 250);
};

关于javascript - PhantomJS 无法访问已删除 QObject 的成员 'evaluate',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29008396/

相关文章:

相当于 Python 的 values() 字典方法的 Javascript

javascript - casperjs/phantomjs如何保存当前网页?

javascript - 如何使用 XPath 表达式检索 CasperJS 中元素的属性

javascript - 如何从 shell 中截取网页的一部分?

node.js - 使用 Phantom 抓取表单提交信息

javascript - 第二个菜单在导航时不添加 .active 类

javascript - 正在传递 ng-click 中必需的 $event

javascript - 仅当右键单击以 "Story"开头的类时才显示上下文菜单按钮

javascript - 如何使用 MomentJS 正确检查日期是否相同或晚于今天?

python - 使用代理与 phantomjs (selenium webdriver)