Правильное использование IF в .check для динамического извлечения значений - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь сделать .formParam-независимый сценарий со случайными значениями.До сих пор я сталкивался с проблемами, пытаясь динамически извлечь атрибуты из запроса.

Итак, во-первых, мне нужно проверить, имеет ли продукт какие-либо атрибуты (необходимо заполнить).Извлеките их с помощью

regex("""\b(product_attribute_\d)(?![\s\S]*?\b\1)""").findAll.optional.saveAs("prod_attributes")   
prod_attributes -> List(product_attribute_1, product_attribute_2, product_attribute_3, product_attribute_4, product_attribute_5)

Затем, если атрибуты не пусты (checkIf (! "Prod_attributes" .isEmpty)), я пытаюсь извлечь значения для каждого атрибута в Seq ("prod_attributes"):

(for (i <- 0 to "${prod_attributes}".size - 1) {
  css("dd[id='product_attribute_input_" + i + 1 + "'][value]").findAll.saveAs("attribute_input_" + i + 1))
}

Теперь я хочу создать новую Карту и указать как ключ = product_attribute_n и значение Список значений для соответствующего атрибута.Например:

val atrib_map= Map(
    product_attribute_1-> List(1, 2), 
    product_attribute_2-> List(3, 4, 5),
    ...... etc
)

Или просто извлечь случайное значение для каждого атрибута. А затем использовать этот список для .formParamSeq.

Пожалуйста, поделитесь своими идеями о моем подходе,и помогите мне узнать, есть ли возможность сделать это.(Или я просто копаю в неправильном направлении, и это должно быть выполнено простыми «жестко закодированными» транзакциями)

Эта часть не работает, но я хотел бы использовать что-то подобное.

val goToProduct = http("""Go_to_product""")
    .get("/product")
    .headers(headers_0)
    .check(
     regex("""\b(product_attribute_\d)(?![\s\S]*\b\1)""").findAll.optional.saveAs("prod_attributes"),
     checkIf(!"prod_attributes".isEmpty){
      for (i <- 0 to "${prod_attributes}".size - 1) {
        css("dd[id='product_attribute_input_" + i + 1 + "'] [value]").findAll.saveAs("attribute_input_" + i + 1)
        }
    })

У меня есть эта часть тела (это элемент с большинством атрибутов, которые нужно заполнить).

Основная идея - иметь не жестко закодированные значения, которые можно анализировать для любого продукта (с 2,3,4, любые атрибуты).

 <!--attributes-->
    <div class="attributes">
        <dl>
            <dt id="product_attribute_label_1">
            <label class="text-prompt">
            Processor
            </label>
            <span class="required">*</span>
            </dt>
            <dd id="product_attribute_input_1">
               <select name="product_attribute_1" id="product_attribute_1">
                    <option value="1">2.2 GHz Intel Pentium Dual-Core E2200</option>
                    <option selected="selected" value="2">2.5 GHz Intel Pentium Dual-Core E2200 [+$15.00]</option>
               </select>
                                
            </dd>
            <dt id="product_attribute_label_2">
                <label class="text-prompt">
                    RAM
                </label>
                <span class="required">*</span>
            </dt>
                <dd id="product_attribute_input_2">
                    <select name="product_attribute_2" id="product_attribute_2">
                        <option value="3">2 GB</option>
                        <option value="4">4GB [+$20.00]</option>
                        <option value="5">8GB [+$60.00]</option>
                    </select>
                                
                </dd>
                <dt id="product_attribute_label_3">
                    <label class="text-prompt">
                        HDD
                    </label>
                        <span class="required">*</span>
                                    </dt>
                <dd id="product_attribute_input_3">
                    <ul class="option-list">
                        <li>
                            <input id="product_attribute_3_6" type="radio" name="product_attribute_3" value="6">
                            <label for="product_attribute_3_6">320 GB</label>
                        </li>
                        <li>
                            <input id="product_attribute_3_7" type="radio" name="product_attribute_3" value="7">
                            <label for="product_attribute_3_7">400 GB [+$100.00]</label>
                        </li>
                    </ul>
                                
                </dd>
                <dt id="product_attribute_label_4">
                    <label class="text-prompt">
                        OS
                    </label>
                        <span class="required">*</span>
                    </dt>
                <dd id="product_attribute_input_4">
                     <ul class="option-list">
                         <li>
                            <input id="product_attribute_4_8" type="radio" name="product_attribute_4" value="8" checked="checked">
                            <label for="product_attribute_4_8">Vista Home [+$50.00]</label>

                         </li>
                         <li>
                            <input id="product_attribute_4_9" type="radio" name="product_attribute_4" value="9">
                            <label for="product_attribute_4_9">Vista Premium [+$60.00]</label>
                         </li>
                     </ul>
                                
                </dd>
                <dt id="product_attribute_label_5">
                    <label class="text-prompt">
                        Software
                    </label>
                </dt>
                <dd id="product_attribute_input_5">
                     <ul class="option-list">
                        <li>
                            <input id="product_attribute_5_10" type="checkbox" name="product_attribute_5" value="10" checked="checked">
                            <label for="product_attribute_5_10">Microsoft Office [+$50.00]</label>
                        </li>
                        <li>
                            <input id="product_attribute_5_11" type="checkbox" name="product_attribute_5" value="11">
                            <label for="product_attribute_5_11">Acrobat Reader [+$10.00]</label>
                        </li>
                        <li>
                            <input id="product_attribute_5_12" type="checkbox" name="product_attribute_5" value="12">
                            <label for="product_attribute_5_12">Total Commander [+$5.00]</label>
                        </li>
                        </ul>
                </dd>
        </dl>
        
    </div>

1 Ответ

1 голос
/ 09 июля 2019

Не похоже, что вы можете динамически добавлять проверки.

Мое решение получает узлы и transform их.Обратите внимание на ^=, который выбирает все узлы, начинающиеся с "product_attribute_input _".

.check(
  css("""dd[id^="product_attribute_input_"]""").ofType[jodd.lagarto.dom.Node].findAll
  .transform{ nodes => 
    nodes.map { node =>
      val name = node.getAttribute("id")
      val valuesInSelect = Option(node.getFirstChildElement("select")).map {
        _.getChildElements().flatMap {  child =>
          Option(child.getAttribute("value"))
        }
        .toList
      }
      val valuesInList = Option(node.getFirstChildElement("ul")).map {
        _.getChildElements()
          .filter { _.getNodeName() == "li" }
          .flatMap { child =>
            Option(child.getFirstChildElement("input")).flatMap { i =>
              Option(i.getAttribute("value"))
            }
          }
          .toList
      }
      name -> valuesInSelect.orElse(valuesInList).getOrElse(List())
    }.toMap
  }
  .saveAs("atrib_map")
)

Когда вы печатаете сеанс, вы можете видеть атрибут как atrib_map -> Map(product_attribute_input_3 -> List(6, 7), product_attribute_input_5 -> List(10, 11, 12), product_attribute_input_2 -> List(3, 4, 5), product_attribute_input_4 -> List(8, 9), product_attribute_input_1 -> List(1, 2))


Такое извлечение данных из узла XML не очень эффективно и не элегантно, но кажется декларативным.

...