Проблема производительности при поиске geb для атрибутов объекта модуля и использования селекторов

описание проблемы

Я пишу спецификацию geb/spock, которая выбирает тестовые данные из DB2 на карту (переменная карты называется preFilledFields - см. Класс MySpec ниже).

Затем эта карта перебирается, и для каждой итерации я также проверяю, совпадает ли значение с одним в строке на странице.

Когда я выполняю утверждение выше, обращаясь к атрибутам объекта модуля, то среднее время выполнения на утверждение составляет ок. 5-6 секунд. Если я выполняю утверждение с использованием селекторов напрямую, то среднее время выполнения на утверждение составляет ок. 70-80 мс См. Класс " MyPage " для более подробной информации относительно утверждений.

Кто-нибудь знает, что может быть причиной этого? Является ли плохая производительность результатом моего кода, или есть общие проблемы с производительностью при использовании модулей в geb?

Ценю любую помощь и вклад, который я могу получить.

Код:

Мой класс "RowModule" выглядит так:

class RowModule extends Module {

static final PREDEFINED_ATTR = "data-predefined-amount"

static content = {
    cell { $("td", it) }
    description { cell(0).text() }
    rubrikNum { cell(1).text().toInteger() }
    preDefinedAmount { cell(0).parent("tr").$("td[$PREDEFINED_ATTR]").attr("$PREDEFINED_ATTR") }
    inputField { cell(0).parent("tr").$("td input") ?: false }
    dataType{ cell(0).parent("tr").attr("data-type") }
}

}

Класс моей страницы выглядит так:

class MyPage extends Page {
    static url = "<some_url>"
    static at = { $("h1").text() == "<some_text>" }

    static content = {
        submitButton { $("input", name:"<some_name>") }
        myPageItems {
            $("table tr").collect { it.module(RowModule) }
        }
    }

    void verifyPrePopulatedFields(name, amount) {
        long now = System.currentTimeMillis();            
        assert amount == selvangivelseItems.find { it.dataType== name}.preDefinedAmount.toInteger()
        //assert amount == $("tr[data-type='" + name+ "']").$(".skts-tooltip-holder").text().toInteger()
        println "Execution time" + (System.currentTimeMillis() - now) + " ms"
    }

    void submit() { submitTaxReturnButton.click() }
}

Мой Spec-файл выглядит так:

class MySpec extends GebReportingSpec {
    @Unroll
    def "field #name is pre-populated with amount #amount from the database"() {
        expect:
            page(MyPage) verifyPrePopulatedFields(name, amount)
        where:
            name <<  preFilledFields.keySet()
            amount <<  preFilledFields.values()
    }
}

1 ответ

Решение

Нет общих проблем с производительностью при использовании модулей в Geb, по крайней мере, тех, о которых я знаю. С другой стороны, ваши селекторы явно неоптимальны.

Во-первых, делая myPageItems.find { it.dataType == name } Вы перебираете все строки в своей таблице и выполняете 3 команды WebDriver (то есть http-запрос между вашим тестом и браузером, который запускается) для каждой из них. Вы могли бы улучшить селектор для dataType в dataType { attr("data-type") } (не уверен на 100%, потому что я не вижу вашей структуры DOM, но это логика), но это все равно будет означать потенциально большое количество запросов. Вместо этого вы должны добавить определение контента сайта следующим образом:

myItem { dataType ->
     $("table tr[data-type='$dataType']").module(RowModule)
}

И затем используйте это как:

assert amount == myPageItem(name).preDefinedAmount.toInteger()

Во-вторых, вы можете упростить и улучшить производительность ваших селекторов в модуле (если мои предположения о вашей DOM верны):

static content = {
    cell { $("td", it) }
    description { cell(0).text() }
    rubrikNum { cell(1).text().toInteger() }
    preDefinedAmount { $("td[$PREDEFINED_ATTR]").attr("$PREDEFINED_ATTR") }
    inputField { $("td input") ?: false }
    dataType{ attr("data-type") }
}

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

Другие вопросы по тегам