我正试图运行一些phantomjs代码时出现问题。理论上,代码应该能够从下面的下拉菜单中选择一个选项。
<select name="Budget_Ctr2" size="1" onchange="JavaScript:Submitthis('Budget_Ctr2')" id="Budget_Ctr2">
<option selected="selected" value="CAAH">CAAH</option>
<option value="CAFLS">CAFLS</option>
<option value="CECAS">CECAS</option>
所有代码都有效,除非我看到以下代码段:
var sel = document.getElementById('Budget_Ctr2');
var opts = sel.options;
到目前为止,我在堆栈上阅读的所有东西都让我认为这应该有效。但是,当我运行程序时,我得到“TypeError:null不是一个对象(评估'sel.options')。 我相当自信'sel'本身不是基于一些测试的null,但是我无法将错误与正在发生的事情相协调。对phantomjs之外的javascript没有超级经验,但是有人有什么想法吗?
答案 0 :(得分:0)
为什么null
不是对象?运行PhantomJS脚本时,它不存在于DOM中。
但是为什么这个元素在非无头浏览器的开发工具中可见呢?由于脚本的工作,它可能是以编程方式添加的。
请记住:如果在page.evaluate
回调触发后立即运行page.open
,则会很快运行 - 页面脚本可能尚未完成其工作。所以你可以等一段大概的时间,然后像这样page.evaluate
:
var seconds = 3;
page.open(function(){
setTimeout(function(){
page.evaluate(){
// do stuff
}
}, 1000 * seconds);
});
或者您可以等待目标元素出现,请参阅waitfor.js
答案 1 :(得分:-1)
您的脚本似乎位于 float(14.95)
float(-1)
float(-1)
float(-1)
部分。如果是,则在加载head
元素之前执行。尝试运行body
命令,它将返回console.log(document.body);
。
您需要将代码包装在null
处理程序中或将其包含在内部
jQuery中的window.onload
,或者将其放在$(document).ready()
标记之前。
请参阅此answers以获取更多信息。