我正在使用量角器为Qlik仪表板进行一些自动化的UI测试。当前使用this sample dashboard来运行一些测试。我打算尝试使用不同的过滤器组合,以查看是否有任何仪表板图形无法呈现。
对于示例仪表板,我打算只单击页面顶部的4个过滤器,然后选择第一个选项。
由于某种原因,我无法让量角器为我选择过滤器。我总是收到超时错误。
我尝试使用browser.driver而不是默认浏览器。我意识到我必须使用browser.driver.get('url'),否则页面将无法加载。我不知道为什么会这样。
下面显示的是我当前的代码:
describe('Qlik Dashboard Test', function() {
it('Primary Filter Testing',function(){
var url = 'https://sense-demo.qlik.com/sso/sense/app/dcb7c95a-9ecd-43e2-8786-cae00108a324/sheet/54b60312-68c5-4d92-a225-79326b68ad5a/state/analysis';
var EC = protractor.ExpectedConditions;
// Reference to all filters
var filter = element.all(by.className('title ng-binding'));
// Reference to first option in each filter
var first_opt = element(by.repeater('textItem in item.textItems'));
// Reference to backbutton
var bb = element.all(by.className('lui-clear-all lui-icon lui-icon--remove'));
// Go to website
browser.driver.get(url);
// Wait for all filters to be visible
browser.wait(EC.visibilityOf(filter , 10000));
// Click on each filter, and select the first avaiable option
filter.each(function(main_filter){
browser.actions().mouseMove(main_filter).click().perform().then(function(){
browser.driver.wait(EC.visibilityOf(first_opt,15000));
}).then(function(){
browser.actions().mouseMove(first_opt).click().perform();
});
});
// Click on back button
bb.each(function(backbutton){
browser.actions().mouseMove(backbutton).click().perform();
}).then(function(){
browser.sleep(2000);
});
})
})
这是我一直收到的错误消息:
Failed: script timeout: result was not received in 11 seconds
(Session info: chrome=71.0.3578.98)
(Driver info: chromedriver=2.45.615355 (d5698f682d8b2742017df6c81e0bd8e6a3063189),platform=Mac OS X 10.14.0 x86_64)
任何帮助将不胜感激!
答案 0 :(得分:1)
设法使其与此一起工作:
describe('Qlik Dashboard Test', function () {
it('Primary Filter Testing', async function () {
await browser.waitForAngularEnabled(false);
var url = 'https://sense-demo.qlik.com/sso/sense/app/dcb7c95a-9ecd-43e2-8786-cae00108a324/sheet/54b60312-68c5-4d92-a225-79326b68ad5a/state/analysis';
var EC = protractor.ExpectedConditions;
var rain = element(by.className('rain rain-loader qv-block-ui ng-scope qv-fade-out'));
// Reference to all filters
var filters = element.all(by.css('.title-wrapper'));
// Reference to backbutton
var bb = element.all(by.className('lui-clear-all lui-icon lui-icon--remove'));
// Go to website
await browser.get(url);
await browser.wait(EC.presenceOf(filters,15000));
await browser.wait(EC.invisibilityOf(rain,15000));
// Wait for all filters to be visible
let numFilter = await filters.count();
console.log(numFilter);
for (let i = 0; i < numFilter; i++) {
await filters.get(i).click();
// Reference to first option in each filter
var first_opt = element(by.repeater('textItem in item.textItems'));
var all_opt = element.all(by.repeater('textItem in item.textItems'));
await browser.wait(EC.presenceOf(first_opt, 15000));
const text = all_opt.get(1).getText();
console.log(text);
await first_opt.click();
await browser.sleep(1000);
}
},120000)
})
感谢DublinDev建议同步/异步,这确实使编写测试变得更加容易。
还编辑了测试的默认预期持续时间,似乎太短了。
似乎有一个ui阻止组件(请参见rain变量),该组件会阻止UI直到加载完所有内容,因此您只需要等待过滤器在DOM中可见,并且让UI阻止程序消失,它将起作用。
答案 1 :(得分:0)
出现问题的原因是因为您链接的站点是非角度站点。默认情况下,量角器将在尝试任何操作之前等待页面的Angular可测试性属性稳定下来,但是显然在非角度网站上,该属性将不存在。
如果将browser.waitForAngularEnabled(false)添加到IT块的开头,则量角器将不会检查此可测试性属性,然后继续。
您可能已经听说Protractor使用webdriverJS与浏览器进行交互,这是一个功能强大的工具。 WebdriverJS可以与任何浏览器页面(Angular或Non-angular)进行交互。量角器包装了webdriverJS,以便更轻松地测试角度页面(主要是通过使用上述可测试性元素等待角度元素加载)。
browser.driver.get()之所以起作用,是因为通过调用browser.driver ...,您正在直接与webdriverJS交互而不是与Protractors功能交互。 WebdriverJS可以直接与非角度站点进行交互,而不会出现问题,但是您将无法使用某些Protractors useful APIs。
此外,您应该考虑禁用控制流并切换到async / await语法。 More info on async/await
describe('Qlik Dashboard Test', function() {
it('Primary Filter Testing',function(){
browser.waitForAngularEnabled(false)
var url = 'https://sense-demo.qlik.com/sso/sense/app/dcb7c95a-9ecd-43e2-8786-cae00108a324/sheet/54b60312-68c5-4d92-a225-79326b68ad5a/state/analysis';
var EC = protractor.ExpectedConditions;
// Reference to all filters
var filter = element.all(by.className('title ng-binding'));
// Reference to first option in each filter
var first_opt = element(by.repeater('textItem in item.textItems'));
// Reference to backbutton
var bb = element.all(by.className('lui-clear-all lui-icon lui-icon--remove'));
// Go to website
browser.get(url);
// Wait for all filters to be visible
browser.wait(EC.visibilityOf(filter , 10000));
// Click on each filter, and select the first avaiable option
filter.each(function(main_filter){
browser.actions().mouseMove(main_filter).click().perform().then(function(){
browser.driver.wait(EC.visibilityOf(first_opt,15000));
}).then(function(){
browser.actions().mouseMove(first_opt).click().perform();
});
});
// Click on back button
bb.each(function(backbutton){
browser.actions().mouseMove(backbutton).click().perform();
}).then(function(){
browser.sleep(2000);
});
})
})
答案 2 :(得分:0)
我要添加新的答案,因为我不想覆盖目前已经发布的信息。我设法使用建议您使用的异步/等待语法来使某些功能正常工作。如果您只是开始这个项目,这对您来说将是一个简单的更改。
我没有管理器来获取过滤器中的值选择,但是过滤器本身被选中。 I found this discussion with may apply to your app。它涉及在conf中设置rootElement属性。
页面加载后,我需要再等待15秒,我不确定100%为什么会这样,但这可能与我上面链接的讨论有关。
我对angularJS的经验有限,但是希望我在这里为您提供了一些有用的信息。
在会议中添加
// Set the date we're counting down to
var countDownDate = new Date("Feb 1, 2019 11:59:20").getTime();
// Add text to <h1 id="fade">
var comingSoon = document.getElementById("fade");
comingSoon.innerHTML = 'COMING SOON';
comingSoon.addEventListener('animationend', ()=>{
// Update the count down every 1 second
var x = setInterval(function() {
// Get todays date and time
var now = new Date().getTime();
// Find the distance between now and the count down date
var distance = countDownDate - now;
// Time calculations for days, hours, minutes and seconds
var days = Math.floor(distance / (1000 * 60 * 60 * 24));
var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
var seconds = Math.floor((distance % (1000 * 60)) / 1000);
// Display the result in the element with id="countdown"
document.getElementById("countdown").innerHTML = days + " days left " + hours + "h "
+ minutes + "m " + seconds + "s ";
});
});
您的规格
SELENIUM_PROMISE_MANAGER: false,