2015-04-02 3 views
0

Я делаю тесты конца и конца UI и перед началом тестов мы хотим собрать данные, необходимые для теста. Для этого мы используем CasperJS и функцию waitForResource().Casperjs waitForResource

Мы хотим подождать, пока ресурс не будет создан в базе данных. Как и ждать перехода статуса ответа HTTP GET с 404 до 200 (или 201). Это API REST.

Код:

casper.waitForResource(urls.rootBE + 'ratecards/default?api_key=' + user.apiKey + '&company=' + organization.id, function(resource) { 
    utils.dump(resource); 
}); 

Это не работает. У вас есть идея, как это сделать?

+0

Возможный дубликат [CasperJS waitForResource: как получить ресурс, который я ждал] (http://stackoverflow.com/questions/24559234/casperjs-waitforresource-how-to-get-the-resource-ive- ждали) –

+0

Я работаю с Жаном-Дэвидом.Из того, что мы понимаем, waitForResource будет ждать, пока данный ресурс будет доступен текущему экземпляру Phantom, следуя предыдущему шагу навигации. Мы пытаемся добиться чего-то другого: мы хотим зациклиться на http до тех пор, пока он не вернет 200 вместо 404. Нам тяжело это делать с CasperJs, учитывая его асинхронный характер. Как мы можем это сделать? – Spiff

ответ

1

Можете ли вы показать мне свой код, который на самом деле вызывает API?

waitForResource фактически просто ждет ресурсов, которые вызываются самой страницей или вручную. Это может быть сделано, чтобы реализовать некий цикл, в котором вы будете называть API каждые 5 секунд, и утверждают, что API будет реагировать с 200 или 201.

редактировать:

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

var condition = false; 
function loop(index,iteration){ 
if(condition) { 
    return; 
} 
else if(index >= iteration) { 
    casper.test.fail('Record not found'); 
    return; 
} 
casper.then(function(){ 
      this.thenOpen('http://www.webpage.com/api/record/543',function(response){ 
     if(response.status==200) { 
      condition = true; 
      this.test.pass("Record found"); 
     } 
     this.echo(response.status); 
    }) 
}) 
.then(function(){ 
    loop.call(this,index+1,iteration) 
}) 
} 

casper.test.begin('Test for record',1,function suite(test){ 
casper.start() 
loop.call(this, 0, 20); 
casper.run(function(){ 
    test.done(); 
}) 
}) 

Если вам нужно использовать звонки из-за высокого трафика, просто используйте setTimeout.

+0

Спасибо за объяснение, мы выяснили, что нам не нужен waitForResource, потому что мы не загружаем ресурс на странице. Мы искали способ утверждать, что ресурс был создан в базе данных. Если вы знаете, как это сделать, дайте нам знать. –

+0

Как я объяснил в своем ответе, это единственный способ, которым я это сделал. Я отредактирую свой ответ с дополнительной информацией. –

+0

@ Jean-DavidYAPO см. Обновленный ответ, я написал для вас простой скрипт –

0

Вы хотите, чтобы получить ответ jsonp или ajax? Сейчас это непросто.

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

В любое время вы не можете получить тело ответа из запроса json или ajax, а только метаданные ответа.

Вы можете подключить запрос ajax или jsonp на клиенте и получить тело ответа с помощью casper.evaluate(), или если ваш запрос является просто «методом GET», вы можете использовать модуль casperjs clientutils с методом sendAJAX() detail ,

И это link может оказать вам большую помощь.

0

Рассмотрите возможность использования либо waitForSelector() на что-то действительные страницы имеют, что другие этого не делают, или вместо того, чтобы получать коды состояния страницы и сортировки надлежащим образом, например, так:

casper.on('resource.received', function(resource) { 
    statuscode = resource.status; 

}); 

if (statuscode < 404) { 
    // Thing to do on valid pages 
} 

Значение с waitForSelector() будет то, что вы можете легко установить таймаут, а также указать неявное действие, если вы нажмете таймаут.

Потенциальный недостаток заключается в том, что некоторые сайты/API имеют перенаправление на месте, когда сломанные URL-адреса перенаправляются на страницу не 404, которая не будет получена во втором экземпляре.

Смежные вопросы