如何在Protractor中检查对象/数组是否包含指定字符串?
Protractor断言失败:处理
getAttribute('style')返回数组的问题 嘿,我一眼就看出问题所在了——你的dialog.getAttribute('style')返回的不是普通字符串,而是一个包含单个字符串元素的数组!看报错里的[ 'display: none; width: 400px;' ]就能明白,直接用toContain会去检查整个数组是否包含子串,这显然不匹配。
你之前调用toString()没用,是因为你直接在getAttribute返回的Promise对象上调用了这个方法(Protractor的大部分API都返回Promise),所以才得到了[object Object],而不是等待Promise解析后对实际的数组调用toString。
给你几个靠谱的解决方案:
方案1:直接取数组的第一个元素
既然返回的是数组,直接提取索引0的元素就行,简单粗暴:
expect(dialog.getAttribute('style')[0]).toContain('display: none');
方案2:用getCssValue精准检查属性
其实要验证元素是否隐藏,完全不用去解析整个style字符串,用getCssValue直接获取display属性的值更靠谱:
expect(dialog.getCssValue('display')).toEqual('none');
这个方法能直接拿到CSS属性的计算值,避免了style字符串格式变化带来的意外问题,是最优解。
方案3:正确处理Promise和数组
如果一定要处理这个数组,你可以用then链式调用,或者用async/await来等待Promise解析后再处理:
用then的写法:
dialog.getAttribute('style').then(function(styleContent) { // styleContent是解析后的数组,转成字符串再检查 expect(styleContent.join('')).toContain('display: none'); });
用async/await的写法(更简洁):
it('should verify dialog is hidden', async () => { const styleArr = await dialog.getAttribute('style'); expect(styleArr.join('')).toContain('display: none'); // 或者结合方案2的最优写法 const displayValue = await dialog.getCssValue('display'); expect(displayValue).toEqual('none'); });
内容的提问来源于stack exchange,提问作者matandked
相关产品推荐
相关产品推荐

