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