量角器:未选择仪表板过滤器

时间:2019-02-01 07:35:36

标签: javascript protractor automated-tests

我正在使用量角器为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)

任何帮助将不胜感激!

3 个答案:

答案 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,