2014-01-04 3 views
3

Я сохранил все URL-адреса изображений в массиве и пытаюсь проверить, правильно ли загружено изображение. Если вы видите приведенный ниже код, мне пришлось повторять несколько строк снова и снова. Как я могу написать его как общий?Как передать параметр функции в casperjs?

casper.start() 
var imagesArray = []; 
imagesArray = ['https://www.google.co.in/images/srpr/logo11w.png', 
'https://www.google.co.in/images/srpr/logo1w.png']; 

casper.thenOpen(imagesArray[0], function() { 
    if (this.currentHTTPStatus === 404) { 
     this.warn(imagesArray[0] + ' is missing (HTTP 404)'); 
    } else if (this.currentHTTPStatus === 500) { 
     this.warn(imagesArray[0] + ' is broken (HTTP 500)'); 
    } else { 
    this.echo(' is okay (HTTP %s)'); 
    } 
}); 

casper.thenOpen(imagesArray[1], function() { 
    if (this.currentHTTPStatus === 404) { 
     this.warn(imagesArray[0] + ' is missing (HTTP 404)'); 
    } else if (this.currentHTTPStatus === 500) { 
     this.warn(imagesArray[0] + ' is broken (HTTP 500)'); 
    } else { 
    this.echo(' is okay (HTTP %s)'); 
    } 
}); 


casper.run(function() { 
this.echo('Image loading test finished'); 
this.exit(); 
}); 

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

function checkImages(item){ 
if (this.currentHTTPStatus === 404) { 
this.warn(item + ' is missing (HTTP 404)'); 
} else if (this.currentHTTPStatus === 500) { 
this.warn(item + ' is broken (HTTP 500)'); 
} else { 
this.echo(' is okay (HTTP %s)'); 
} 
} 

     casper.thenOpen(imagesArray[0], function() { 
    this.evaluate(checkImages(imagesArray[0])); 
    }); 

     casper.thenOpen(imagesArray[1], function() { 
    this.evaluate(checkImages(imagesArray[1])); 
    }); 

Заранее спасибо.

ответ

0

В качестве напоминания подумайте о методе оценки() как о затворе между средой КасперС и той, которую вы открыли; каждый раз, когда вы передаете закрытие для оценки(), вы вводите страницу и выполняете код, как если бы вы использовали консоль браузера. Поэтому вы не можете использовать evaluate по адресу checkImages.

Использование echo так:

casper.thenOpen(imagesArray[0], function() { 
    this.echo(checkImages(imagesArray[0])); 
}); 

casper.thenOpen(imagesArray[1], function() { 
    this.echo(checkImages(imagesArray[1])); 
}); 
0

У вас нет никакой необходимости для thenOpen в этом тесте, так как вы только хотите проверить код ответа. вы МОЖЕТЕ это сделать, но это невероятно расточительно время/ресурсы. это то, как я достиг той же цели:

casper.test.begin('link tester', 73, function(test) { 
    casper.start(url); 

getLinks = function(){ 
    links = this.evaluate(function(){ 
     var links = document.getElementsByTagName('a'); 
     links = Array.prototype.map.call(links,function(link){ 
      return link.getAttribute('href'); 
     }); 
     return links; 
    }); 
} 

casper.then(getLinks); 

casper.then(function(response) { 
    for (q = 0; q < links.length; q++) { 
    if (response == undefined || response.status >= 400) { 
     this.test.fail("URL " + links[q] + " failed with response code " + (response.status)); 
    } else { 
     this.test.pass((response.status + " ---- " + links[q])); 
    } 
    } 
}); 

единственный нюанс с этим было бы, что вы можете иметь только 1 отказ на функцию Каспер. если вы тестируете 100 URL-адресов на странице, и вы не выполняете 4-го, вам придется исправить это, прежде чем вы сможете увидеть, не сработали ли другие. таким образом, вам нужно будет вложить casper.then() в ваш оператор if. В случае, если вам интересно, это будет выглядеть следующим образом:

casper.then(function(response) { 
    links.forEach(function(link){ 
    if (response == undefined || response.status >= 400) { 
     casper.then(function() { 
     this.test.fail("URL " + link + " failed with response code " + (response.status)); 
     }) 
    } else { 
     this.test.pass((response.status + " ---- " + link)); 
    } 
    }); 
}); 
+0

PhantomJS поддерживает 'Array.prototype.forEach', но его можно было решить с помощью IIFE внутри тела цикла. Я думаю, это выглядит лучше. –

+0

Я не понимаю, почему вы думаете, что это решает проблему. Можете ли вы уточнить? Может, ты что-то забыл. Сначала вы извлекаете все ссылки со страницы. Затем вы перебираете все ссылки, но вы все еще находитесь на одной странице, и вы не открываете страницу, которую хотите проверить. Таким образом, если стартовая страница не загружается, каждая ссылка должна завершиться неудачей, но поскольку стартовая страница не удалась, нет никакой ссылки для проверки, и вы получите 73 сомнительных тестовых примера. –

4

Поскольку все then* функций являются асинхронной функцией шага вставки шага в очередь, вы можете вызвать их в петле. Поскольку imagesArray является уроженцем массива, он может повторяться через помощью Array.prototype.forEach который поддерживает PhantomJS:

var imagesArray = [ 
    'https://www.google.co.in/images/srpr/logo11w.png', 
    'https://www.google.co.in/images/srpr/logo1w.png' 
]; 

casper.start(); 

imagesArray.forEach(function(imageUrl){ 
    casper.thenOpen(imageUrl, function() { 
     if (this.currentHTTPStatus === 404) { 
      this.warn(imageUrl + ' is missing (HTTP 404)'); 
     } else if (this.currentHTTPStatus === 500) { 
      this.warn(imageUrl + ' is broken (HTTP 500)'); 
     } else { 
      this.echo(' is okay (HTTP %s)'); 
     } 
    }); 
}); 

casper.run(); 

Простого цикл хватил бы, но тогда вы будете иметь проблемы с imagesArray[i] внутри thenOpen. Переменная i никогда не изменится, потому что каждый шаг выполняется после завершения цикла. Поэтому каждый imagesArray[i] будет показывать последний URL-адрес. Поскольку JavaScript имеет область уровня производительности, URL привязан к каждой итерации и никогда не изменяется после этого.

+0

как это изменится, если я получу 'imagesArray' внутри' casper.then', в этом случае casper.thenOpen всегда кажется вызванным с последним элементом? – srrvnn

+0

@srrvnn Это не так. Вероятно, есть небольшая разница между этим кодом и тем, что вы пробовали. Вы можете задать новый вопрос, если у вас все еще есть проблема после отладки. Обратите внимание на последний параграф моего ответа (используете ли вы цикл for?). –

+0

Вы правы.Я пробовал forEach после прочтения вашего последнего абзаца, и он отлично работает. Спасибо. – srrvnn

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