Я не знаю, как это сделать в etaoin
, но использование может использовать библиотеку Forest для манипулирования простым hiccup / html, если это поможет.
(with-debug-hid
(with-forest (new-forest)
(let [root-hid (add-tree-hiccup
[:div {:class :some-div-1}
[:div {:class :some-div-2}
[:label "Some Junk"]
[:div {:class :some-div-3}
[:label "Specify your shipping address"]
[:div {:class :some-div-4}
[:input {:type "text" :autocomplete "off" :required "required"
:placeholder "" :class "el-input__inner"}]]]]])
Мы хотим найти узел: input в том же элементе: div, что и узел: label с текстом «Укажите адрес доставки». Затем мы находим его родителя и используем его как начало нового поиска для нужного: входного узла:
label-path (only (find-paths root-hid [:** {:tag :label :value "Specify your shipping address"}]))
parent-div-hid (-> label-path reverse second)
shipping-address-input-hid (find-hid parent-div-hid [:div :div :input])
Юнит-тест показывает, что он работает:
(is= label-path [:0006 :0005 :0004 :0001])
(is= parent-div-hid :0004)
(is= (hid->hiccup shipping-address-input-hid)
[:input {:type "text", :autocomplete "off", :required "required",
:placeholder "", :class "el-input__inner"}])
(value-set shipping-address-input-hid "1234 Main St")
(is= (hid->hiccup shipping-address-input-hid)
[:input {:type "text", :autocomplete "off", :required "required",
:placeholder "", :class "el-input__inner"}
"1234 Main St"])
Мы можем вывести окончательно измененное дерево:
(hid->hiccup root-hid) =>
[:div
{:class :some-div-1}
[:div
{:class :some-div-2}
[:label "Some Junk"]
[:div
{:class :some-div-3}
[:label "Specify your shipping address"]
[:div
{:class :some-div-4}
[:input
{:type "text",
:autocomplete "off",
:required "required",
:placeholder "",
:class "el-input__inner"}
"1234 Main St"]]]]]
Вы также можете увидеть молниеносный разговор от Clojure Conj 2017.