2015-05-04 4 views
3

Я новичок в этой структуре, а также не понимаю, как протестировать функциональность сортировки с помощью CasperJS.Как проверить сортировку (по возрастанию и по убыванию) в casperjs

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

Search functionality picture

ответ

3

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

function cmpLexiInsAsc(a, b) { 
    return a.toLowerCase() < b.toLowerCase(); 
} 
function cmpLexiInsDesc(a, b) { 
    return a.toLowerCase() > b.toLowerCase(); 
} 

Трудности будет получать соответствующие элементы, которые можно сравнить. Например, вам, вероятно, придется разделить цену и валюту, проанализировать цену как число и сравнить их.

Я возьму на себя оставшуюся часть ответа, что у вас есть значение по умолчанию <table> и используйте порядок столбцов.

Вы можете определить функцию, которая принимает индекс столбца (начиная с 1), дополнительный селектор, чтобы найти элемент в ячейке и функцию сравнения для этого столбца. Он внутренне определяет селектора CSS или выражения XPath для доступа к ячейкам таблицы. Имейте в виду, что для этого вам нужно знать, сколько строк есть и возможно настроить, если есть строка заголовка/нижнего колонтитула.

function compare(colIndex, cellSelector, cmpFunc){ 
    function rowSelector(rowIndex) { 
     return "table#tableId tr:nth-child(" + rowIndex + ") > td:nth-child(" + colIndex + ")" + cellSelector; 
    } 

    var count = this.getElementsInfo("table#tableId tr"); 
    if (count < 2) { 
     return true; 
    } 

    var previous = this.getElementInfo(rowSelector(i)).text, 
     current; 
    for(var i = 2; i <= count; i++) { 
     current = this.getElementInfo(rowSelector(i)).text; 
     if (!cmpFunc(previous, current)) { 
      return false; 
     } 
     previous = current; 
    } 
    return true; 
} 

Вы можете запустить эту compare() функции для нескольких столбцов в зависимости от ваших критериев. Например:

casper.then(function(){ 
    casper.test.assert(compare.call(this, 1, " > span > span.info", cmpLexiInsAsc), "Column 1 ascending"); 
    this.click("some selector to change ordering"); 
}); 

casper.then(function(){ 
    casper.test.assert(compare.call(this, 2, " > div > span.info", cmpLexiInsDesc), "Column 2 descending"); 
}); 

Существует редкая ошибка в PhantomJS 1.x для :nth-child() CSS селекторов. Вы можете попробовать использовать XPath селекторы, которые поддерживаются в CasperJS через вспомогательную функцию:

var x = require('casper').selectXPath; 
... 
casper.getElementsInfo(x("//table[@id='tableId']//tr["+rowIndex+"]/td["+colIndex+"]/span/span")); 

Обратите внимание, что CasperJS построен на вершине PhantomJS и имеет те же ограничения. Вы не можете напрямую работать с элементами DOM вне контекста страницы (casper.evaluate()). Вам нужно будет получить представление такого элемента заранее. Я делаю это, обращаясь к объекту text на объект, возвращенный с getElementsInfo().

+0

, иначе мы также можем использовать sort() для восходящего и обратного() для убывания. Без установки каких-либо критериев извлекать содержимое и использовать функцию sort() сортировать его и хранить в переменной. Теперь установите некоторые критерии и извлеките это содержимое и сохраните его в другой переменной. Теперь сравните обе переменные. –

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