我编写了一些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')
。所以应该引入某种延迟或等待。
但是怎么样?
由于
答案 0 :(得分:1)
尝试检查您的元素的length
,例如
if($('.BrightcoveExperience').length){
var brightcove_url = $('.BrightcoveExperience').attr('data')
// you code here
}