Как написать один метод но что б разные айтемы выбирались из дроп листа

Добрый день! Такая проблема…есть дроп даун лист с формулами…мне надо выбрать формулу каждую (а их штук 30) и проверить с каждой формулой вычисления…Если бы у меня было хотя бы пять формул …я бы создавал на каждую формулу метод который бы кликал на дроплист и выбирал формулу по икспасу или по порядку(5 было бы)… но у меня 30 формул и 30 методов не хотелось бы создавать… может кто поможет …как можно написать один метод но потом просто подставлять разные например икспасы айтемов из листа ?? Я использую Selenium, WebDriver, Java, testNG

Вот кусочек кода с дропдаун листом и формулами (5 формул кинул только , а то список был бы большим=))

select id="formula_select" class="form-control">
option value="2"># 2 1-X-2/option>
option value="3"># 3 W1-X-2/option>
option value="4"># 4 AH1(0)-2X-2/option>
option value="5"># 4 AH1(-1)-AH2(+1.5)-2X/option>
option value="26"># 4 TO(2)-TU(2.5)-TU(1.5)/option>
option value="7"># 5 AH1(-0.25)-X-2/option>

а вот собстно как я реализовал (например метод для нажатия и выбора первой формулы)

public void SelectFirstFormula() {
 getDriver().findElement(By.xpath(getProperty("FormulaDropDownField.xpath")));
 getDriver().findElement(By.xpath(getProperty(1Formula.xpath)));

Советую сделать массив который будет держать в уме элементы option, а потом рэндомно выбирать 1 или сколько вам нужно.

Твой вопрос - простейший пример DDT (data driven test). То есть когда одна и та же проверка должна быть проделана для множества различных значений.
Что здесь можно сделать:

  1. Во-первых, необходимо вспомнить теорию тестирования, а конкретно domain testing, классы эквивалентности и т.д. И прежде чем тупо тестировать все подряд значения, подумать, нельзя ли их проверить, выбирая по одному из эквивалентных интервалов
  2. Если п. 1 учтен и сделан сознательный выбор тестирования всех значений методом перебора, то у TestNG есть для этого механизм, называемый DataProvider (см ссылку)

Рандом применять нужно очень осторожно и осознанно. Потому что один из критериев хорошего теста (в т.ч. автоматического) - это повторяемость. А если падать тест будет только на каком-то одном значении, выбираемом рандомно из многих, то это плохой тест

Этот дроп даун лист задаёт формулу … по которой я должен сделать обчисления… но на каждую формулу я должен сделать хоть один тест… после выбора формулы меняется и сама форма, и поля… и рандомный выбор формул я считаю не подходит…

а можно поподробнее.?? конечно мне бы на яве было бы интереснее …но я не совсем понимаю принцип…чем это уменьшит собственно копипаст методов,

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

На питоне будет что-то вроде

for i in driver.find_element_by_id("formula_select").find_elements_by_tag_name("option"):
    i.click()

То есть здесь элемент i будет одной из ваших формул, а дальше вы можете сами сделать что угодно с ними, например вытащить атрибут value или текст выпилить и т.д и т.п. Или по вашей задаче выполнять нужные действия.

Спасибо… но всё равно не понимаю((…

for i in driver.find_element_by_id("formula_select").find_elements_by_tag_name("option"):
    i.click()

Здесь в for цикле просто выводится вырезка всех элементов - формул. Вне зависимости сколько их там. Теперь каждый i - элемент это формула.

Если непонятно почитайте что такое for цикл в нужном языке программирования.

Дальше вы можете сделать так.

for i in driver.find_element_by_id("formula_select").find_elements_by_tag_name("option"):
------- здесь клик на дропдаун ---------
    i.click()   // клик на формулу
------- здесь методы которые нужно выполнить после клика на формулу-------

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

Если бы сценарий был всегда идентичный (одинаковые шаги), а менялись лишь данные, можно было бы (как уже подсказали выше) применять DataProvider механизм. Но суть ваших тестов то не просто в выборе формулы из списка, а и в подстановке параметров с последующими вычислениями.

Итого, у вас будет 30 методов, для которых придется подключать DataProvider, которому в свою очередь придется скормить N тестовых данных (для каждого теста), базирующихся на классах эквивалентности. Другими словами, на выходе у вас будет 30 методов, каждый из которых циклически будет подставлять новые данные в свою формулу.

П.С. Т.к. формулы бывают разные (по числу / типу параметров), а протестировать нужно все, вариант с 1 методом не прокатит.

1 лайк

Есть еще один вариант - смоделировать бизнес-логику на основе требований. Да затратно, да рискованно, но иногда необходимо, если количество степеней свободы слишком велико.

@vmaximv распиши пожалуйста чуть подробнее мысль? Чё-то так сжал, что я не могу постичь суть :slight_smile: Это ты про приоритезацию требований?

Ну если “грубо” - взять формулу из ddl, распарсить, вычислить, сравнить expected с actual.
Но мне видится, что проблема у ТС много проще, а мы забегаем сильно далеко вперед :wink:

DATAPROVIDER используйте