Как делать клики по Xpath - по нумерации?

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Всем доброго времени суток. Нужно кликать на каждый из элементов, отталкиваясь от того, какая цифра в переменной.
Подскажите, пожалуйста, есть идентичные элементы:
53871
Что их отличает, так это последовательность. Код примерно такой, если формировать его вручную:asset-card[class="c-asset ng-star-inserted"]
А если брать сформированный код Зенкой - выходит:
Код:
/html/body/app-root/mat-sidenav-container/mat-sidenav-content/exchange/div/div[2]/user-side/div/user-inventory/assets-card-scroll/div/div/asset-card[2]
Где достаточно взять asset-card[1] и заменить в квадратных скобках цифру - для поиска нужного следующего элемента, но проблема в том, что в (Конструктор Действий) Xpatch не вставить так просто переменную вместо цифры. Вот постает вопрос, как правильно сформировать будет xpath + как я понимаю, для клика - придется ложить его в кубик С#. Как это все сделать, что бы я могу с помощью переменной с цифрой, кликать по одному из этих братьев?

Заранее, благодарен за помощь!
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
Делай через
C#:
String.Format("/html/body/exchange/div/div[{0}]/user-side/div/div/div/asset-card[{0}]", project.Variable["number"].Value);
 
  • Спасибо
Реакции: Gunjubasik

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Можно, пожалуйста, объяснить, как этим пользоваться?
Создал С#:
String.Format("/html/body/exchange/div/div[2]/user-side/div/div/div/asset-card[{0}]", project.Variable["number"].Value);
Там где {0}, должно вставляться с переменной {-Variable.number-} верно? Но что-то оно не работает. Как я понимаю, код не полный, а это лишь одна из строк? Могли бы показать, пожалуйста, полный код, который приведет к клику по Xpath:
Код:
/html/body/app-root/mat-sidenav-container/mat-sidenav-content/exchange/div/div[2]/user-side/div/user-inventory/assets-card-scroll/div/div/asset-card[1]
Делай через
C#:
String.Format("/html/body/exchange/div/div[{0}]/user-side/div/div/div/asset-card[{0}]", project.Variable["number"].Value);
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Да что же я делаю не так? вставляю в C# кубик свой код:
C#:
String.Format('/html/body/exchange/div/div[2]/user-side/div/div/div/asset-card[{0}]', project.Variable["number"].Value);
Ошибка:
Компиляция кода Ошибка в действии "CS1012" "Превышение допустимого числа символов в символьной константе". [Строка: 0; Cтолбец: 15]
53884
 

molotok

Client
Регистрация
17.04.2015
Сообщения
733
Благодарностей
358
Баллы
63
Что вы изучали по теме xpath перед тем, как взялись за работу?
 
  • Спасибо
Реакции: orka13

molotok

Client
Регистрация
17.04.2015
Сообщения
733
Благодарностей
358
Баллы
63

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Википедия xpath - просмотрел . Был проект - написанный на парсинге по html - написал огромный проект - который частично запустил. Посоветовали переходить на Xpath - так как более стабильная штука. Вот загугливал определенную информацию - на нашем форуме, если не нахожу, задаю вопросы тут. Когда помогают решить задачу, я по тем же методам переделываю свой проект и на этому учусь. Учить с 0 - пытался NodeJS - 12 часов чистого времени потратил - но как показала практика, я не могу запомнить то, что физически не применяю. Поэтому приходится методом вопросов на форуме и применение на практике решать проблемы и заодно учить - по крайней мере, таким же методом, я научился писать графических ботов для игр на UoPilot, а ну и Zenno таким же методом учил.
Что вы изучали по теме xpath перед тем, как взялись за работу?
Та это уже я вторым вариантом попробовал...Вот код второго варианта:
C#:
String.Format("/html/body/exchange/div/div[2]/user-side/div/div/div/asset-card[{0}]", project.Variable["number"].Value);
Там тоже ошибка:
Компиляция кода Ошибка в действии "CS1061" ""ZennoLab.InterfacesLibrary.ProjectModel.IZennoPosterProjectModel" не содержит определение для "Variable". Не удалось найти метод расширения "Variable", принимающий первый аргумент типа "ZennoLab.InterfacesLibrary.ProjectModel.IZennoPosterProjectModel" (пропущена директива using или ссылка на сборку?)". [Строка: 0; Cтолбец: 95]
Кавычики одинарные, а надо двойные
 

molotok

Client
Регистрация
17.04.2015
Сообщения
733
Благодарностей
358
Баллы
63
В описании ошибки указывается строка и столбец ошибки - зайдите прверьте.
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113

molotok

Client
Регистрация
17.04.2015
Сообщения
733
Благодарностей
358
Баллы
63

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113

molotok

Client
Регистрация
17.04.2015
Сообщения
733
Благодарностей
358
Баллы
63
  • Спасибо
Реакции: Gunjubasik

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Да, добавил S - в Variable и кубик успешно завершен. А как мне теперь клик делать, подскажите, пожалуйста?

Вот так попробуйте
C#:
String.Format("//html/body/exchange/div/div[2]/user-side/div/div/div/asset-card[{0}]", project.Variables["number"].Value);
Кстати, у Вас путь не просто плохой, а очень плохой.
И по поводу пути, я же тему с того и начал, что бы помогли сложить нормальный путь - когда есть перечень одинаковых элементов - по которым нужно кликать - отталкиваясь от цифры элемента(строка за которой он находится)
 

molotok

Client
Регистрация
17.04.2015
Сообщения
733
Благодарностей
358
Баллы
63
Покажите сайт и куда нужно кликнуть
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
Что-то не помогло понять - в чем именно дело.
Хоспаде, ну загугли ты как этим пользоваться.

Я же тебе написал, как пример, а не финальный вариант решения, соответственно:
- В моём примере я сократил xPath, просто чтобы он помещался в строку. У тебя же другой xPath, более полный.
- {0} это порядковый номер переменной после запятой, в этой переменной передавай что угодно, хоть цифру, хоть текст.

Весь этот String.Format необходимо вставлять вместо твоего старого xPath, т.к. это и есть твой новый динамический xPath.


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

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Гуглил я все, не могу сам додуть, пока не увижу как оно работает. Сверху я написал, почему я спрашиваю конкретные вопросы! Вы же не первый раз заходите и пытаетесь частично отвечать, что бы я потом заходил в библиотеки и голова тупо взрывалась - на 1 элемент будет потрачено сутки, если не больше. Я понимаю, если бы у меня было время на изучения - тут бы семью прокармливать успевать.
Хоспаде, ну загугли ты как этим пользоваться.

Я же тебе написал, как пример, а не финальный вариант решения, соответственно:
- В моём примере я сократил xPath, просто чтобы он помещался в строку. У тебя же другой xPath, более полный.
- {0} это порядковый номер переменной после запятой, в этой переменной передавай что угодно, хоть цифру, хоть текст.

Весь этот String.Format необходимо вставлять вместо твоего старого xPath, т.к. это и есть твой новый динамический xPath.


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

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Прикрепил код именно тех элементов, по которым нужно кликать.
Покажите сайт и куда нужно кликнуть
Вот все что в красном, каждый элемент c-asset ng-star-inserted , нужно прокликивать, используя число из переменной. Если цифра в переменной 0 , значит клик на первый блок и т.д.

53889
 

Вложения

  • 359,6 КБ Просмотры: 3

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
углил я все, не могу сам додуть, пока не увижу как оно работает.
C#:
HtmlElementCollection elements = tab.FindElementsByXPath("/html/body/app-root/mat-sidenav-container/mat-sidenav-content/exchange/div/div[2]/user-side/div/user-inventory/assets-card-scroll/div/div/asset-card[2]");

HtmlElementCollection elements = tab.FindElementsByXPath(String.Format("/html/body/app-root/mat-sidenav-container/mat-sidenav-content/exchange/div/div[{0}]/user-side/div/user-inventory/assets-card-scroll/div/div/asset-card[{0}]", "2"));
C#:
// Это равнозначные строки, только вместо двойки в кавычках, вставляй свою переменную с числом.

"/html/body/app-root/mat-sidenav-container/mat-sidenav-content/exchange/div/div[2]/user-side/div/user-inventory/assets-card-scroll/div/div/asset-card[2]"
String.Format("/html/body/app-root/mat-sidenav-container/mat-sidenav-content/exchange/div/div[{0}]/user-side/div/user-inventory/assets-card-scroll/div/div/asset-card[{0}]", "2")

Тут пример, как работает String.Format.
 
  • Спасибо
Реакции: Gunjubasik

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Код:
C#:
HtmlElementCollection elements = tab.FindElementsByXPath(String.Format("/html/body/app-root/mat-sidenav-container/mat-sidenav-content/exchange/div/div[{0}]/user-side/div/user-inventory/assets-card-scroll/div/div/asset-card[{0}]", "2"));
Ошибка:
Компиляция кода Ошибка в действии "CS0103" "Имя "tab" отсутствует в текущем контексте". [Строка: 0; Cтолбец: 34]
53891

C#:
HtmlElementCollection elements = tab.FindElementsByXPath("/html/body/app-root/mat-sidenav-container/mat-sidenav-content/exchange/div/div[2]/user-side/div/user-inventory/assets-card-scroll/div/div/asset-card[2]");

HtmlElementCollection elements = tab.FindElementsByXPath(String.Format("/html/body/app-root/mat-sidenav-container/mat-sidenav-content/exchange/div/div[{0}]/user-side/div/user-inventory/assets-card-scroll/div/div/asset-card[{0}]", "2"));
C#:
// Это равнозначные строки, только вместо двойки в кавычках, вставляй свою переменную с числом.

"/html/body/app-root/mat-sidenav-container/mat-sidenav-content/exchange/div/div[2]/user-side/div/user-inventory/assets-card-scroll/div/div/asset-card[2]"
String.Format("/html/body/app-root/mat-sidenav-container/mat-sidenav-content/exchange/div/div[{0}]/user-side/div/user-inventory/assets-card-scroll/div/div/asset-card[{0}]", "2")

Тут пример, как работает String.Format.
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Не объяснив в чем дело, снова послали на библиотеки, мало того , ссылка на начальный курс по изучению зенно....Можно вас пожалуйста попросить, не отписывать в моих темах, если у вас не хватает нервов, ответить четко на поставленный вопрос, без других ссылок, пожалуйста! Надеюсь на понимание и хорошего вам время проведения!
Начни с изучения какого-то бесплатного курса, например, с этого.
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
Не объяснив в чем дело, снова послали на библиотеки
Все очень просто, ты хочешь делать в коде, но при этом, не пожелал уделить время для изучения базовых основ работы с кодом. Тебе необходимо начать с изучения курсов, возьми курс от Rostonix'a, начни с простых вещей.

ЗЫ, это не вопрос нервов, ответив я спровоцирую следующий, и так далее. Именно по этой причине, я сразу обращаю внимание на необходимость изучения основ.
 
  • Спасибо
Реакции: doc, Platon и Oleg1987

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 228
Благодарностей
784
Баллы
113
Я понимаю, если бы у меня было время на изучения - тут бы семью прокармливать успевать.
На задавания вопросов и ожидания ответов времени уходит куда больше, чем на самостоятельное изучение
 

limarkximus

Client
Регистрация
01.08.2019
Сообщения
116
Благодарностей
73
Баллы
28
путь возьми более человечный с помощью XPath Helper
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Повторюсь и вам, я из тех людей, которые не то что ленятся, а не могут учить теорию, а делают на практике - изучая материал прямо в деле. Вот у меня есть проекты на Zenno - написал их с горем по полам с помощью вас, понемногу научился понимать в коде из-за того, что переношу с одного проекта в другой уже с готового материала, который мне помогли сложить. Я пытаюсь смотреть и видеоуроки и читать вики+форум, ну не могу я - голова просто закипает...Так как дополнительно в ней же алгоритмы математических просчетов - применяемый в проектах zenno.

Все очень просто, ты хочешь делать в коде, но при этом, не пожелал уделить время для изучения базовых основ работы с кодом. Тебе необходимо начать с изучения курсов, возьми курс от Rostonix'a, начни с простых вещей.



Не относите, пожалуйста, всех под одно гребенку. Я пока задал вопрос - пошел писать доп. код к моим проектам - если что-то сломалось, я иду фиксить, в некоторых моментах нужно продумывать алгоритмы - от которых голова кипит очень сильно. Изучение материалов для меня - это как для не которых стих выучить - возможно, но через одно место. Здесь так же, я очень ценю помощь людей на форуме и благодарен им за драгоценное время, потраченное ими на меня, но я вот такой тип людей, зубрить попросту не могу, пока на деле не начну тестировать. Спасибо что уделили минутку своего времени, надеюсь найдется еще одна, что бы помочь мне с ответом.
На задавания вопросов и ожидания ответов времени уходит куда больше, чем на самостоятельное изучение



Вот, я сделал более человечный путь: //asset-card[@data-analytics-id="list_userInventory"][1], но кликнуть я по нему не могу, так как не знаю как. (используя переменную с цифрами)
путь возьми более человечный с помощью XPath Helper
 
Последнее редактирование:

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Повторюсь и вам, я из тех людей, которые не то что ленятся, а не могут учить теорию, а делают на практике - изучая материал прямо в деле.
я просто удивляюсь. как будто все тут сидели и штудировали теорию. Все так же решают проблемы по мере поступления. Однако не раз Вам уже говорили, что для решения сложных задач надо знать базовый простой уровень.
Например как вставить переменную в xpath в конструкторе действий. Как склеить строки в c#. Это база и тут не надо быть семи пядей во лбу, что бы все это понять. Вы же не будете браться за перевод с китайского не изучив основы алфавита ? так и тут. надо понимать простые вещи, что бы в сложных задачах видеть части того что понятно и что следует до изучить.
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Может кто-то, пожалуйста, объяснить, как сделать клик по данному коду?
C#:
var tab = instance.ActiveTab;
HtmlElementCollection elements = tab.FindElementsByXPath(String.Format("/html/body/app-root/mat-sidenav-container/mat-sidenav-content/exchange/div/div[2]/user-side/div/user-inventory/assets-card-scroll/div/div/asset-card[{0}]", "2"));
Добавлял в конце кода click - но походу это не оно:
C#:
var tab = instance.ActiveTab;
HtmlElementCollection elements = tab.FindElementsByXPath(String.Format("/html/body/app-root/mat-sidenav-container/mat-sidenav-content/exchange/div/div[2]/user-side/div/user-inventory/assets-card-scroll/div/div/asset-card[{0}]", "2")).Click();
 
Последнее редактирование:

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Уже разобрались, как вставить Xpath, теперь проблема с кликом, в конце .Click() не помогает, хотя где не ищу - пишет что так нужно.

я просто удивляюсь. как будто все тут сидели и штудировали теорию. Все так же решают проблемы по мере поступления. Однако не раз Вам уже говорили, что для решения сложных задач надо знать базовый простой уровень.
Например как вставить переменную в xpath в конструкторе действий. Как склеить строки в c#. Это база и тут не надо быть семи пядей во лбу, что бы все это понять. Вы же не будете браться за перевод с китайского не изучив основы алфавита ? так и тут. надо понимать простые вещи, что бы в сложных задачах видеть части того что понятно и что следует до изучить.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
FindElementsByXPath ищет коллекцию элементов.
FindElementByXPath ищет один элемент
если все таки через коллекцию надо то как то так.
C#:
var el_col=instance.ActiveTab.FindElementsByXPath(xpath);
var el = el_col.Elements[0];
el.Click(); // может не сработать
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(el); // движение крысы к элементу
instance.ActiveTab.FullEmulationMouseClick("left","click"); // клик
 
  • Спасибо
Реакции: Gunjubasik

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Спасибо, клик получился. А есть возможность вместо курсора - сразу получать слепой клик? Так как для того, что бы увидеть более 8 элементов, которые я ищу, нужно прокручивать вниз, а если действовать по тому коду, что вы дали, клик происходит поверх препятствия (перекрытие на сайте). По крайней мере проблем с кликом на перекрытые элементы ( в конструкторе действий) - нету. Но как же такой клик сделать с помощью C# кубика?
53898



FindElementsByXPath ищет коллекцию элементов.
FindElementByXPath ищет один элемент
если все таки через коллекцию надо то как то так.
C#:
var el_col=instance.ActiveTab.FindElementsByXPath(xpath);
var el = el_col.Elements[0];
el.Click(); // может не сработать
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(el); // движение крысы к элементу
instance.ActiveTab.FullEmulationMouseClick("left","click"); // клик
 
Последнее редактирование:

Кто просматривает тему: (Всего: 10, Пользователи: 0, Гости: 10)