PhantomJS不会使用select标记

时间:2017-10-27 17:58:49

标签: javascript html drop-down-menu phantomjs html-select

我正试图运行一些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没有超级经验,但是有人有什么想法吗?

2 个答案:

答案 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以获取更多信息。