Транспортир: Фильтры приборной панели не выбираются - PullRequest
0 голосов
/ 01 февраля 2019

Я использую Protractor для автоматического тестирования пользовательского интерфейса для своих панелей мониторинга Qlik.В настоящее время используется этот пример панели инструментов для запуска некоторых тестов.Я планирую просто попробовать разные комбинации фильтров, чтобы посмотреть, не будут ли отображаться какие-либо графики панели мониторинга.

Для примера панели мониторинга я намерен просто нажать на каждый из 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 голосов
/ 01 февраля 2019

Я добавляю новый ответ, так как не хочу перезаписывать информацию, которую я уже разместил.Мне удалось заставить некоторые из этих функций работать с использованием синтаксиса async / await, который я рекомендую вам использовать.Если вы только начинаете этот проект, это будет легким изменением для вас.

Я не управлял, чтобы получить выбор значения внутри фильтра, но сам фильтр выбирается нормально. Я обнаружил, что это обсуждение может применяться к вашему приложению .Он включает установку свойства rootElement в conf.

Мне нужно было подождать еще 15 секунд после загрузки страницы, и я не уверен на 100%, почему это так, но это может быть связано с обсуждением, на которое я ссылался выше.

У меня ограниченный опыт работы с angularJS, но надеюсь, что я предоставил вам некоторую полезную информацию здесь.

В качестве дополнения

SELENIUM_PROMISE_MANAGER: false,

Ваша спецификация

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;

        // 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.driver.sleep(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
            // let first_opt = element(by.repeater('textItem in item.textItems')).row(1);

            // await browser.wait(EC.visibilityOf(first_opt, 15000));
            // await first_opt.click();
            await browser.driver.sleep(5000);
        }
    }
}
0 голосов
/ 04 февраля 2019

Удалось заставить его работать с этим:

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 за предложение синхронизации / асинхронности, значительно упростившая написание тестов.

Также отредактировал ожидаемую продолжительность по умолчанию дляtest, похоже, он был слишком коротким.

Кажется, есть компонент блокировки пользовательского интерфейса (см. переменную rain), который блокирует пользовательский интерфейс до тех пор, пока все не будет загружено, поэтому вам просто нужно подождать, пока фильтры будут видны вDOM, и для блокировщика пользовательского интерфейса, чтобы уйти, и это будет работать.

0 голосов
/ 01 февраля 2019

Причина ваших проблем в том, что этот сайт, на который вы ссылаетесь, является неугловым сайтом.По умолчанию Protractor будет ожидать установления атрибута угловой тестируемости страницы, прежде чем предпринимать какие-либо действия, но, очевидно, на неугловом сайте этот атрибут не будет существовать.

Если вы добавите browser.waitForAngularEnabled (false) вначало вашего ИТ-блока Protractor не будет проверять это свойство тестируемости и продолжит работу.

Возможно, вы слышали, что Protractor использует webdriverJS для взаимодействия с браузером, который является мощным инструментом.WebdriverJS может взаимодействовать с любой страницей браузера, угловой или не угловой.Транспортир оборачивает webdriverJS, чтобы упростить тестирование угловых страниц (в основном за счет ожидания загрузки угловых элементов с использованием упомянутого выше элемента тестируемости).

Причина. Browser.driver.get () работает потому, что вызывает браузер.driver ... вы взаимодействуете непосредственно с webdriverJS, а не с функциями транспортировщиков.WebdriverJS может взаимодействовать с неугловыми сайтами напрямую, без проблем, но тогда вы не сможете использовать некоторые из полезных API-интерфейсов транспортировщиков .

Кроме того, следует рассмотреть возможность отключения потока управления и переключенияк асинхронному / ожидающему синтаксису. Больше информации об асинхронности / ожидании

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);
        });
   })
})
...