Превышено время ожидания результата асинхронного сценария при выполнении сценариев транспортира с appium

У меня возникла проблема при выполнении более одного теста в транспортире: истекло время ожидания результата асинхронного сценария после 60010 с. Код учебного сценария, который выполняется сразу после входа в систему: Вот код сценария входа + сценарий обучения

Вот код, который я использую в своем файле конфигурации из Кодекс, предложенный в другом вопросе, но он не решил мою проблему!

onPrepare: function() {
  return browser.getProcessedConfig().then(function(config) {
    var browserName = config.capabilities.browserName;
    browser.manage().timeouts().setScriptTimeout(60000);

  });

Здесь файл конфигурации

PS: Даже если я укажу неправильное местоположение для элемента, у меня будет ошибка тайм-аута, а не этот элемент не может быть найден! как будто эта строка кода «кнопка перехода по ссылке» никогда не выполняется

  • Это потому, что учебник делает вызов ajax?

Error Вот мой HTML-код:

</div></md-card-content> </md-card><!-- end ngIf: !expandChart --> </div> </div> </div></md-content> </div></div> <!-- Google Analytics: change UA-XXXXX-X to be your site's ID --> <!--<script>--> <!--!function(A,n,g,u,l,a,r){A.GoogleAnalyticsObject=l,A[l]=A[l]||function(){--> <!--(A[l].q=A[l].q||[]).push(arguments)},A[l].l=+new Date,a=n.createElement(g),--> <!--r=n.getElementsByTagName(g)[0],a.src=u,r.parentNode.insertBefore(a,r)--> <!--}(window,document,'script','https://www.google-analytics.com/analytics.js','ga');--> <!--ga('create', 'UA-XXXXX-X');--> <!--ga('send', 'pageview');--> <!--</script>--> <script src="scripts/vendor.js"></script> <script src="cordova.js"></script> <script src="scripts/scripts.js"></script> <script src="https://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/sha1.js"></script> <script src="https://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/sha256.js"></script> <script src="https://crypto-js.googlecode.com/svn/tags/3.1.2/build/components/enc-base64-min.js"></script> <div class="introjs-overlay" style="top: 0;bottom: 0; left: 0;right: 0;position: fixed;opacity: 0.8;"></div><div class="introjs-helperLayer " style="width: 538px; height:366px; top:64px;left: 195px;"></div><div class="introjs-tooltipReferenceLayer" style="width: 538px; height:366px; top:64px;left: 195px;"><div class="introjs-tooltip" style="left: 546px;"><div class="introjs-tooltiptext">Watchlist view. Swipe the row in the grid to the left to show the delete action.</div><div class="introjs-bullets"><ul><li><a class="active" href="javascript:void(0);" data-stepnumber="1">&nbsp;</a></li><li><a href="javascript:void(0);" data-stepnumber="2">&nbsp;</a></li><li><a href="javascript:void(0);" data-stepnumber="3">&nbsp;</a></li><li><a href="javascript:void(0);" data-stepnumber="4">&nbsp;</a></li><li><a href="javascript:void(0);" data-stepnumber="5">&nbsp;</a></li><li><a href="javascript:void(0);" data-stepnumber="6">&nbsp;</a></li><li><a href="javascript:void(0);" data-stepnumber="7">&nbsp;</a></li><li><a href="javascript:void(0);" data-stepnumber="8">&nbsp;</a></li></ul></div><div class="introjs-progress" style="display: none;"><div class="introjs-progressbar" style="width:12.5%;"></div></div><div class="introjs-arrow left" style="display: inherit;"></div><div class="introjs-tooltipbuttons"><a class="introjs-button introjs-skipbutton" href="javascript:void(0);">Don't show it again!</a><a href="javascript:void(0);" class="introjs-button introjs-prevbutton introjs-disabled" tabindex="-1">Previous</a><a href="javascript:void(0);" class="introjs-button introjs-nextbutton">Next</a></div></div></div></body></html>​

Журнал Appium


person Emna Ayadi    schedule 06.05.2016    source источник
comment
Да, это угловой сайт   -  person Emna Ayadi    schedule 07.05.2016
comment
Он постоянно опрашивает $http или $timeout?   -  person Gunderson    schedule 07.05.2016
comment
Извините, что вы подразумеваете под опросом $http или $timeout?   -  person Emna Ayadi    schedule 07.05.2016
comment
Это Angular, спросите у своих разработчиков. Если это произойдет, страница никогда не завершит синхронизацию, и Protractor никогда не узнает, что страница загружается, поэтому jasmine истечет время ожидания. Наше приложение делало это   -  person Gunderson    schedule 07.05.2016
comment
Например, служба keepAlive, позволяющая пользователям оставаться в системе в течение определенного времени, или что-то в этом роде.   -  person Gunderson    schedule 07.05.2016
comment
В таком случае, как мы можем решить эту проблему?   -  person Emna Ayadi    schedule 07.05.2016
comment
Если это так, идеальным решением было бы спросить их, могут ли они переключить этот сервис на использование Interval.js (часть Angular). В противном случае вам придется включить browser.ignoreSynchronization и обращаться с вашим приложением так, как будто оно не угловое.   -  person Gunderson    schedule 07.05.2016
comment
я пробовал с browser.ignoreSynchronization= true, но это не очень хороший элемент решения, который не будет найден, и мне нужно в будущем проверить угловой эффект.   -  person Emna Ayadi    schedule 09.05.2016
comment
@Emma Привет, я нашел этот вопрос в вашем комментарии. Так что я постараюсь помочь. --- Сначала измените element(by.buttonText('Next')) на $('.introjs-nextbutton') --- Во-вторых EC.stalenessOf... похоже, что вы ждете, пока кнопка НЕ ​​будет прикреплена к DOM, а затем нажмите на нее... для меня это не имеет никакого смысла. Попробуйте удалить EC.stalenessOf, затем просто выполните tutorial.click(). Попробуйте эти предложения и скажите, работает ли это ;)   -  person Linh Pham    schedule 10.05.2016
comment
@LinhPham, привет, хорошо, спасибо, я попробую рассказать тебе;)   -  person Emna Ayadi    schedule 10.05.2016
comment
@LinhPham: извините, у меня все та же ошибка :(   -  person Emna Ayadi    schedule 10.05.2016
comment
@ Эмма, можешь ли ты как-нибудь поделиться со мной полным кодом этого блока описания после того, как ты настроил?   -  person Linh Pham    schedule 10.05.2016
comment
Хорошо, я поделюсь конфигурацией и тестом для входа в систему + учебник   -  person Emna Ayadi    schedule 10.05.2016
comment
@LinhPham: я обновляю код в вопросе скриншотами.   -  person Emna Ayadi    schedule 10.05.2016


Ответы (4)


<сильный>1. Что касается проверки маршрута

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

expect(browser.getCurrentUrl()).toContain('#/the_route_of_logged_in'); 
// '#/' is just illustration. You can remove it to make it shorter
// => like this ...toContain('the_route_of_logged_in');

<сильный>2. Относительно клика по учебнику

browser.wait(EC.elementToBeClickable(tutorial), 10000);

Сделайте browser.wait с EC для кнопки, которую можно нажать, прежде чем пытаться щелкнуть ее (похоже, у вас здесь хороший подход)

=> РЕЗЮМЕ вы можете попробовать:

'user strict';

var EC = protractor.ExpectedConditions;

describe('tutorials', function () {

    it('should make click into tutorial button', function () {

        expect(browser.getCurrentUrl()).toContain('the_route_of_logged_in');

        var tutorial = $('.introjs-nextbutton'); 
        browser.wait(EC.elementToBeClickable(tutorial), 8000, 'Timed out');
        tutorial.click();

        browser.sleep(8080); // regardless we are not reaching this point. But I will suggest to reduce this sleep time like 1000 (1s).
    });
});

<сильный>3. (необязательно) на случай, если 2 пункта выше не помогут

В вашей специализации все login-spec.js и tutorial-spec.js. Добавьте process.nextTick(done); в блок afterAll(), чтобы убедиться, что нет никаких Jasmine Reporters, застрявших после спецификации.

describe('foo', function(){

  afterAll(function(done){
    process.nextTick(done);
  });  

  it('should bar...', function() {});
}

P.S. Имейте в виду, что я понятия не имею, могут ли помочь мои предложения/подход. Поскольку отладка с помощью e2e-test всегда болезненна ... потому что мы всегда, вероятно, не знаем, «откуда берутся ошибки». Так что все, что я могу сделать, это дать вам предложения. (иногда у меня уходили часы на то, чтобы просто понаблюдать за поведением браузера, чтобы определить проблему e2e-теста)

И НЕ КОПИРУЙТЕ мой код в свой код. Я печатал его с изображениями, которые вы предоставили, я могу сделать некоторые опечатки.

person Linh Pham    schedule 10.05.2016
comment
Спасибо за ваши предложения, я постараюсь сообщить вам;) - person Emna Ayadi; 10.05.2016
comment
@ Эмма, я добавил третье предложение. Если ошибка все еще присутствует, скопируйте и вставьте ее сюда. Я проверю это еще раз завтра, развеселить! ;) - person Linh Pham; 10.05.2016
comment
Хорошо, я проверю, потому что до сих пор ошибка все еще присутствует. Большое спасибо за все ваши попытки;) - person Emna Ayadi; 10.05.2016
comment
@ Эмма, похоже, у нас все тот же вывод ошибок? - person Linh Pham; 11.05.2016
comment
Да, но проблема становится все более заметной, если я делаю только сценарий входа в систему с этим expect(browser.getCurrentUrl()).toContain('#/quotes'); некоторое время, он терпит неудачу, и когда я добавляю browser.sleep(time_to_wait); не слишком большой, и когда я ставлю его достаточно большим (например: › 8000). Я получил эту ошибку тайм-аута! - person Emna Ayadi; 11.05.2016
comment
с browser.waitForAngular();, используемым в тесте входа в систему, expect(browser.getCurrentUrl()).toContain('#/quotes'); передается, затем в учебном тесте (теперь мы уверены, что это страница, которую мы ищем) всегда у нас есть проблема с тайм-аутом (используя все 3 предложения) - person Emna Ayadi; 11.05.2016
comment
@ Эмма, очень полезная информация, у меня есть 2 вопроса --- относительно browser.sleep(time_to_wait);, можете ли вы посчитать, сколько времени прошло после входа в систему и появления ошибки тайм-аута? --- пожалуйста, попробуйте войти в систему вручную и используйте часы, чтобы проверить, сколько времени потребовалось для завершения входа в систему (маршрут + представление были изменены и обновлены)? - person Linh Pham; 11.05.2016
comment
Давайте продолжим обсуждение в чате. - person Emna Ayadi; 11.05.2016

Добавьте параметр в conf.js в разделе возможностей:

maxSessions: 1,

это должно помочь. Также ваш timeoutinterval может быть слишком большим, 30000 должно быть достаточно.

Или при подготовке изменить строку на:

browser.manage().timeouts().implicitlyWait(5000);

@EDIT: изменить на что-то похожее на это, нашел что-то вроде этого

  1. baseUrl равен 10.0.2.2 вместо localhost, потому что он используется для доступа к локальному хосту хост-компьютера в эмуляторе/устройстве Android.
baseUrl: 'http://10.0.2.2:' + (process.env.HTTP_PORT || '8000'),

Возможности новой команды:

 newCommandTimeout: 60

Также может быть полезно использование обещаний вместо тайм-аутов.

someethingToDo.click().then(function(){

  return somethingToDo.click();

}).then(function(){
    //morecode
});
person Hikaryu    schedule 06.05.2016
comment
Та же ошибка с первым ответом! попробую второй ;) - person Emna Ayadi; 06.05.2016
comment
Извините, даже со вторым вариантом у меня все еще та же проблема! для входа в систему это сделано, эта опция щелчка вообще не работает на домашней странице - person Emna Ayadi; 06.05.2016
comment
У меня есть вопрос. Вы используете транспортир или какой-нибудь pytractor или protractor.net? У меня была похожая проблема, когда я работал над PyTractor, и мне пришлось заменить его на чистый ProTractor. - person Hikaryu; 06.05.2016
comment
я использую транспортир для тестирования сайта на мобильном устройстве (симулятор iPad) - person Emna Ayadi; 06.05.2016
comment
Я редактирую основной ответ, проверьте, мб, он будет работать :), и скажите, у вас домашняя страница отображается на мобильном телефоне или нет? - person Hikaryu; 06.05.2016
comment
Все та же проблема :( Проблема в том, что домашняя страница отображается и остается много времени, но второй тест не выполняется (я даже пытался поместить этот тест в тот же файл спецификации и в тот же it('....',function() { ....................}) - person Emna Ayadi; 06.05.2016
comment
Давайте продолжим обсуждение в чате. - person Hikaryu; 06.05.2016

Я думаю, у вас может быть проблема с настройкой тайм-аутов. Удалите все ссылки на тайм-аут из вашего файла конфигурации и попробуйте что-то вроде этого (при необходимости отрегулируйте, чтобы включить другие конфигурации):

exports.config = {
    allScriptsTimeout: 60000,
    getPageTimeout: 30000,
    jasmineNodeOpts: {
        defaultTimeoutInterval: 62000,
    }
}
person finspin    schedule 11.05.2016
comment
Я пробовал, но у меня остался жасмин DEFAULT_TIMEOUT_INTERVAL - person Emna Ayadi; 13.05.2016

Наконец, я попытался решить свою проблему, добавив этот обратный вызов

describe("long asynchronous specs", function() {
    beforeEach(function(done) {
      done();
    }, 10000);
    });

Вот ссылка от jasmine Asynchronous_Support, которая помогает мне понять проблемы с тайм-аутом. Надеюсь, что это может помочь вам,

person Emna Ayadi    schedule 13.05.2016