Protractor测试中获取与使用属性的方法咨询
嘿,作为刚接触Protractor时踩过不少异步坑的过来人,我来给你好好梳理下这个问题~首先你提到的XY问题顾虑很合理,如果之后发现自己的方向偏了,随时调整就好,先聚焦当前的滑块测试需求哈。
首先明确一点:完全不需要把it()语句包裹在Promise里!it()是Jasmine测试框架用来定义测试用例的入口,它的回调函数会由框架自动执行,而Protractor本身就是为处理异步操作设计的,我们只需要在it()内部正确处理异步逻辑就行。
下面给你两种常用的实现方式,适配不同版本的Protractor:
1. 用async/await(推荐,现代Protractor写法)
现在Protractor已经弃用了旧的控制流,async/await让异步代码看起来和同步代码一样清晰,非常适合新手:
it('should move slider to middle and verify value', async function() { // 定位滑块和手柄元素 const slider = element(by.css('.your-slider-selector')); const sliderHandle = element(by.css('.your-slider-handle-selector')); // 获取滑块的总宽度(异步操作,用await等待结果) const sliderSize = await slider.getSize(); const sliderTotalWidth = sliderSize.width; // 更精准的中间位置:如果手柄本身有宽度,要减去手柄宽度的一半 const handleSize = await sliderHandle.getSize(); const handleWidth = handleSize.width; const middleOffset = (sliderTotalWidth - handleWidth) / 2; // 拖动手柄到计算好的中间位置 await browser.actions() .dragAndDrop(sliderHandle, {x: middleOffset, y: 0}) .perform(); // 获取滑块当前值并断言 const currentSliderValue = await slider.getAttribute('value'); expect(currentSliderValue).toEqual('50'); // 替换成你的预期值 });
2. 用Promise链式调用(旧版Protractor控制流写法)
如果你用的是较老版本的Protractor,它自带的控制流会自动管理Promise顺序,不需要await,直接用then链式调用即可:
it('should move slider to middle and verify value', function() { const slider = element(by.css('.your-slider-selector')); const sliderHandle = element(by.css('.your-slider-handle-selector')); slider.getSize().then(function(sliderSize) { const sliderTotalWidth = sliderSize.width; return sliderHandle.getSize().then(function(handleSize) { const handleWidth = handleSize.width; const middleOffset = (sliderTotalWidth - handleWidth) / 2; return browser.actions() .dragAndDrop(sliderHandle, {x: middleOffset, y: 0}) .perform(); }); }).then(function() { return slider.getAttribute('value'); }).then(function(currentSliderValue) { expect(currentSliderValue).toEqual('50'); }); });
额外的优化建议(可能解决你的XY问题)
如果你的滑块是AngularJS生态的组件(比如ui-slider),其实可以跳过模拟拖动的步骤,直接操作Angular的scope模型,这样测试更稳定,不会受布局变化影响:
it('should set slider to middle value via scope', async function() { // 直接通过JS代码修改滑块绑定的scope变量 await browser.executeScript(` const sliderElement = document.querySelector('.your-slider-selector'); const sliderScope = angular.element(sliderElement).scope(); sliderScope.yourSliderModel = 50; // 替换成你的模型变量名 sliderScope.$apply(); // 触发Angular的脏检查更新视图 `); // 验证值是否正确 const currentValue = await element(by.model('yourSliderModel')).getAttribute('value'); expect(currentValue).toEqual('50'); });
这种方法比模拟用户拖动更高效可靠,毕竟我们的核心需求是验证滑块值和中间位置的对应关系,而不是测试拖动动画本身~
内容的提问来源于stack exchange,提问作者random_error
相关产品推荐
相关产品推荐

