Как проверить функциональность сортировки(по возрастанию и по убыванию) в casperjs


Я новичок в этом фреймворке и также не получаю никакого представления о том, как проверить функциональность сортировки с помощью CasperJS.

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

Функцию поиска картинки

1 3

1 ответ:

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

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().