В XPATH не подставляется значение переменной
-
Скрипт:
0_1553529459599_Тест - Подстановка переменной в XPATH.xmlЧто делает скрипт:
Скрипт заходит на страничку:
https://agroserver.ru/user/248200/
Затем находит блок «Контакты»
Затем перебирает все свойства в блоке «Контакты» (я намеренно упростил действие с каждым свойством - в реальности будет копирование свойства в переменную, но сейчас я поставил просто вывод сообщения в лог)В чём проблема:
В XPATH не подставляется значение переменной.Почему я использую такой хитрый XPATH:
Потому что на страничке используются одни и те же html конструкции для блоков «Товары и услуги» и «Контакты». То есть различить их можно только по XPATH с указанием номера div:XPATH>//div[@class="right"]/div[1]
XPATH>//div[@class="right"]/div[2]Проблема в том, что на страничке может быть разное количество блоков.
Может быть только один блок «Товары и услуги»:
https://agroserver.ru/user/240930/А может не быть никаких блоков:
https://agroserver.ru/user/241235А может быть только только один блок «Контакты»:
https://agroserver.ru/user/248815/Потому я не могу обратиться сразу к нужному блоку контакты. Приходится перебирать все блоки. А затем, когда нахожу нужный блок, приходится обращаться к этому блоку через XPATH с переменной внутри (ведь я заранее не знаю, какой будет номер div'а у блока «Контакты»).
Думал можно сделать определение по количеству блоков, типа посчитал блоки на странице и если их 2, то обращаюсь ко второму. Однако у меня нет уверенности, что блоки всегда идут по порядку. Может будет ситуация, когда блок Контакты будет первым, а за ним блок «Товары и услуги».
Почему же не работает подстановка переменной в XPATH, @support, @Fox?
-
@morozover said in В XPATH не подставляется значение переменной:
XPATH>//div[@class="right"]/div[1]
Если нужен только блок "Контакты", то почему сразу не искать его?
И уже если он существует, то брать из него данные.Типо такого:
//div[@class="rblock"]/div[contains(text(),"Контакты:")]/../ul/li
-
@morozover said in В XPATH не подставляется значение переменной:
В чём проблема:
В XPATH не подставляется значение переменной.Синтаксическая ошибка происходит из за идущих трёх подряд квадратных скобок:
>XPATH>//div[@class="right"]/div[[[
MY_CYCLE_INDEX]]]
/ul/liесли их разделить пробелом
>XPATH>//div[@class="right"]/div
[ [[
MY_CYCLE_INDEX]] ]
/ul/liто всё будет работать
либо записать так:
>XPATH>//div[@class="right"]/div[VAR_MY_CYCLE_INDEX]/ul/li
-
@fox спасибо! понял.
Но теперь новая загадка: почему скрипт запускает главный цикл 3 раза?
У меня на страничке 2 блока div[@class="rblock"].Вроде бы цикл должен выполниться 2 раза.
А он выполняется 3 раза и зависает тут:
Ожидаю элемент >XPATH>//div[@class="rblock"]/div[@class="title"]>AT>3
Это понятно, почему скрипт виснет тут.НО почему цикл запускается третий раз? Хотя должен запуститься только 2 раза!
Вот поправленный скрипт:
0_1553585985824_Тест - Подстановка переменной в XPATH.xml
-
@morozover said in В XPATH не подставляется значение переменной:
@fox спасибо! понял.
Но теперь новая загадка: почему скрипт запускает главный цикл 3 раза?
У меня на страничке 2 блока div[@class="rblock"].Вроде бы цикл должен выполниться 2 раза.
А он выполняется 3 раза и зависает тут:
Ожидаю элемент >XPATH>//div[@class="rblock"]/div[@class="title"]>AT>3
Это понятно, почему скрипт виснет тут.НО почему цикл запускается третий раз? Хотя должен запуститься только 2 раза!
Вот поправленный скрипт:
0_1553585985824_Тест - Подстановка переменной в XPATH.xmlЭто баг вложенных действий "Начать Цикл", по умолчанию количество элементов от селектора записывается в переменную ELEMENT_LENGTH и значение из внутреннего цикла перетирает значение из внешнего, можно в коде скрипта изменить название переменной внутреннего цикла и всё будет работать. Сейчас оформляю баг для @support'a.
-
@fox То есть я поймал именно баг? Или я что-то в скрипте накосячил с этой переменной ELEMENT_LENGTH?
-
@morozover said in В XPATH не подставляется значение переменной:
@fox То есть я поймал именно баг? Или я что-то в скрипте накосячил с этой переменной ELEMENT_LENGTH?
Ну я как бы специально выделил это слово
:D
. Но @support уже выпустил патч, по этому придется ждать 2 недели. Сейчас можно вообще отказаться от использования вложенных действий "Начать Цикл".Править код. Там не сложно, нужно только изменить имя переменной [[ELEMENT_LENGTH]] в коде во вложенном скрипте. Вот тестовый скрипт
Заменить действие "Начать Цикл" обычным циклом. Скрипт.