Пардон. Забыл ссылку скинутьпопробуй так
Код://*[contains(string(), 'USA')]
Если тебе именно по этому примеру, то такПардон. Забыл ссылку скинуть
http://lessons.zennolab.com/en/index
Проблема в том что я не хочу вручную по xpath искать этот радио Баттон и кликать на него. Я хочу задать keyword и чтобы система искала по этому ключевому слову сам элементЕсли тебе именно по этому примеру, то так
(//h2[contains(text(), 'USA')]/preceding-sibling::input)[last()]
Но что-то мне подсказывает, что это лишь пример, а задача другая. В общем тут универсального решения нет. Надо смотреть на каждом сайте индивидуально. Эти чекбоксы везде по разному делают. Каждый извращается как может.
Здесь у тебя текст в h2, а кликать тебе надо по input, который находится рядом.
Мне нужно универсальное решение
string key = "USA";
Tab tab = instance.ActiveTab;
tab.FindElementByXPath(string.format("(//h2[contains(text(), '{0}')]/preceding-sibling::input)[last()]", key), 0).RiseEvent("click", "Full");
Мы не понимаем друг другаКод:string key = "USA"; Tab tab = instance.ActiveTab; tab.FindElementByXPath(string.format("(//h2[contains(text(), '{0}')]/preceding-sibling::input)[last()]", key), 0).RiseEvent("click", "Full");
Я же первый день на форуме чтобы что то элементарное просить)))Код:string key = "USA"; Tab tab = instance.ActiveTab; tab.FindElementByXPath(string.format("(//h2[contains(text(), '{0}')]/preceding-sibling::input)[last()]", key), 0).RiseEvent("click", "Full");
ок. я тебя понял. Такого решения нет.радио Баттон и кликать на него
//ввод текста
string xpath_exp = "//input[@aria-label='лалала']";
string action_ev = "set|value";
string set_action = project.Variables["text"].Value;
return CommonCode.FindElementAndExecuteAction(instance, xpath_exp, action_ev, set_action);
Хоть и старая статья, но помогает до сих пор. Спасибо ребята. Выручили!Данный код позволяет очень удобно работать с xpath из C# шага, задача кода - замена стандартных "кубиков" на более продвинутый метод поиска элементов - xpath, при этом в удобной обёртке.
Технология xpath очень гибкая, в частности одно из популярных применений (которые сложно сделать без неё стандартными средствами ZP) - поиск элементов методом "найти элемент, а в нём другой элемент, а в нём третий..." то есть вложенный поиск когда невозможно найти уникальный признак по которому можно сразу идентифицировать элемент.
Также можно например найти соседний элемент (который имеет уникальный признак), и от него "оттолкнуться" чтобы найти нужный нам элемент (который не имеет уникального признак поиска). В общем простор для поиска элементов просто широчайший.
Как работает:
- Вставляется функция в блок "общий код", это и есть обработчик
- Из C# шага вызывается код "клиента" который выполняет что вам надо (кликнуть, взять что-то, установить значение, в общем классический get|set|rise)
В чём основное удобство, вот так выглядит код в C# шаге:
Входные параметры:C#:string xpath_exp = "//select[@id='lang-chooser']/option[@selected='selected'][contains(.,'United States')]"; string action_ev = "rise|focus"; string set_action =""; return CommonCode.FindElementAndExecuteAction(instance, xpath_exp, action_ev, set_action);
xpath_exp - выражение xpath для нахождения элемента
action_ev - что делаем с элементом, возможные варианты:
аргумент 1:
- get - взять значение
- set - установить значение
- rise - выполнить JS event
аргумент 2: то что делаем с элементом, например комплексные варианты с примерами:
get|width - взять ширину найденого элемента
set|value - установить значение в элемент, например в текстовое поле нужный вам текст
rise|click - клик по элементу
В общем здесь всё то же самое что и в конструкторе действий.
set_action - используется лишь в случаях когда делается set (например set|value или там set|style), то есть установка значения, в этом случае пишется указанный текст, то есть то что будет прописано в значении.
Также реализованы следующие фишки:
rise|scroll - промотает до нужного элемента
set|selecteditems - выбор выпадающего меню, при этом поддерживает Regex:ваш_текст
Прочая информация:
- Код работает начиная с версии ZP 5.8.0.0
- Используется тип эмуляции заданный в проекте (в настройках, либо заданный вами в шаге)
- Сейчас пока что нет возможности распознавать капчу таким образом (не сделан get|captcha)
- Если элемент не будет найден, то этот шаг выйдет с ошибкой
- Для составления xpath выражений удобно использовать расширение браузера FireFox под названием Firepath (ставится как дополнение к дополнению Firebug)
- Код написал darkdiver по моей просьбе, за что ему низкий поклон и большая благодарность
- Уроки по xpath можно найти здесь http://zvon.org/xxl/XPathTutorial/Output_rus/example1.html
Пример использования кода во вложениях.
list.Add("строка");А как полученный innertext записать в список, чтобы построчно было? А то пишется по строчно, но берешь строку, а в итоге берется все содержимое
а как бершь то ? покажи.Ну оно записывает конечно. Но в итоге берешь строку - берется весь текст
var y = instance.ActiveTab.FindElementByXPath(".//*/select[contains(@id, '123')]", 0);
if (String.IsNullOrEmpty(y.GetAttribute("selecteditems")))
{
project.SendInfoToLog("Pusto");
}
else {
IZennoList list = project.Lists["temp"];
//List<string> list = new List<string>();
list.Add(y.GetAttribute("innertext"));
}
не, как ИЗ списка берешь ?C#:var y = instance.ActiveTab.FindElementByXPath(".//*/select[contains(@id, '123')]", 0); if (String.IsNullOrEmpty(y.GetAttribute("selecteditems"))) { project.SendInfoToLog("Pusto"); } else { IZennoList list = project.Lists["temp"]; //List<string> list = new List<string>(); list.Add(y.GetAttribute("innertext")); }
ну странно конечно, попробуй так получить table;кубиком получить строку
Не объединили еще с основным кодом?@mig-z, воспользуйтесь этим снипетом:
Позже объединю это дело с кодом из первого поста.C#:Tab tab = instance.MainTab; if (tab.IsBusy) tab.WaitDownloading(); // get document Document doc = tab.MainDocument; // find element by attribute HtmlElementCollection heCol = doc.FindElementsByXPath(@"//a"); //вытаскиваем атрибут href из каждого элемента var data = heCol.AttributesToString("href").Split(new string[] {Environment.NewLine},0).ToList(); //закидываем всё в список project.Lists["Список 1"].AddRange(data); project.SendInfoToLog("добавлено ["+data.Count+"] элементов");
Снипет ищет все совпадения по XPath (все теги <a>), вытаскивает у каждого совпадения свой аттрибут ("href"), и сохраняет их все в список ("Список 1").
Ещё годиков 5 подождите...Не объединили еще с основным кодом?
к чему непонятный сарказм! Я ничего не ждал, нашел через поиск и обратился к человеку с вопросом. И ваше мнение никто вроде не спрашивал!Ещё годиков 5 подождите...
Я и не тебе писал. Это форум, а не твоя личная переписка, не путай.к чему непонятный сарказм! Я ничего не ждал, нашел через поиск и обратился к человеку с вопросом. И ваше мнение никто вроде не спрашивал!
можно же было так и написать, правильно? А не умничать.Я и не тебе писал. Это форум, а не твоя личная переписка, не путай.
Ты спрашиваешь у чувака, который уже много лет не появляется на форуме.
try{
CommonCode.FindElementAndExecuteAction(instance, ".//a", "rise|click");
}
catch{
throw new Exception("NOT FOUND");
}
El = CommonCode.FindElementAndExecuteAction(instance, XPath, "rise|click", "");
if(El == null){
throw new Exception("Элемент не найден!");
}