尚未创建的DOM对象(TypeError:undefined)与Capybara,PhantomJS测试

时间:2014-04-14 13:30:37

标签: javascript jquery tdd capybara phantomjs

我编写了一些javascript代码,当单击一个按钮时,它会执行以下代码(这只是方法的一部分,在此行之前和之后有一些代码。视频_id设置在此行之上的某处)。< / p>

var data_url = $('.BrightcoveExperience').attr('data').replace(/(videoPlayer=)[^\&]+/, '$1' + video_id);

当我在浏览器中测试代码时,代码可以正常工作。没有控制台错误。

然而,我的自动化Cucumber测试(Capybara with PhantomJS)失败,并显示以下错误消息

One or more errors were raised in the Javascript code on the page. If you don't care about these errors, you can ignore them by setting js_errors: false in your Poltergeist configuration (see documentation for details).

TypeError: 'undefined' is not an object (evaluating '$('.BrightcoveExperience').attr('data').replace')    

基本上$('.BrightcoveExperience').attr('data')会在我的自动化测试中返回undefined 出于某种原因。

如果我将代码重写为以下内容,则测试将通过。

var brightcove_url = $('.BrightcoveExperience').attr('data')
if (typeof brightcove_url !== 'undefined') {
    brightcove_url = brightcove_url.replace(/(videoPlayer=)[^\&]+/, '$1' + video_id);
}

我认为这是由竞争条件引起的。在自动化测试中,当我点击按钮时,在点击事件代码中,尚未创建DOM对象$('.BrightcoveExperience')。所以应该引入某种延迟或等待。

但是怎么样?

由于

1 个答案:

答案 0 :(得分:1)

尝试检查您的元素的length,例如

if($('.BrightcoveExperience').length){
    var brightcove_url = $('.BrightcoveExperience').attr('data')
    // you code here
}