Генерация url из переменных в C#

romasa464

Client
Регистрация
18.06.2017
Сообщения
69
Благодарностей
12
Баллы
8
Суть вопроса. Реализовал входные настройки, при работе с которыми кладётся в переменную нужное значение, по итогу из настроек должно быть, скажем, 3 переменные, например:

Код:
{-Variable.varOne-}
{-Variable.varTwo-}
{-Variable.varThree-}

По итогу нужно сделать генерируемый из настроек универсальный урл, по которому будет совершён переход, например:
Код:
var parseUrl = "vk.com/" + {-Variable.varOne-}+"?excludenudity="+{-Variable.varTwo-}+"&orientations="+{-Variable.varThree-}
После return parseUrl;
Должно получиться что-то вроде:
Код:
vk.com/ключевой%20запрос?excludenudity=первый_тип_настроек&orientations=второй_тип_настроек
Чтобы в итоге сделать переход по сгенерированному адресу из переменной parseUrl, например:

Код:
tab.Navigate({-Variable.parseUrl-}, {-Variable.parseUrl-});
Как это реализовать синтаксически? Не могли бы вы мне показать простейший пример?
 

romasa464

Client
Регистрация
18.06.2017
Сообщения
69
Благодарностей
12
Баллы
8
Друзья, пока ждал ответ, разобрался сам. Если кому интересно. Допустим, объявили вы в настройках переменную, выводите её в проект:

Код:
string pathOne = project.Variables["OrientUrl"].Value; //Переменная со значением ориентации
string pathTwo = project.Variables["KeyWord"].Value; //Переменная со значением ключевого запроса
Где, "string" - тип переменной (строка).
"=" символ присвоения значения от правого операнда - левому.
"pathOne" - имя новой переменной, в которую мы кладём значение раздутой дефолтной переменной, для большего удобства.
"project.Variables["OrientUrl"].Value;" - стандартный синтаксис вывода переменной.

Далее, создаём переменную итогового url-адреса:

Код:
string parseUrl = "vk.com/" + pathTwo + "?excludenudity=true" + "&mediatype=" + pathOne;
Где, "string" - тип переменной (строка).
"=" символ присвоения значения от правого операнда - левому.
"parseUrl" - имя новой переменной, в которой мы собираем итоговый адрес из строковых значений и переменных , для большего удобства.

Если мы впишем:
return parseUrl;

Результат будет таким:

Код:
vk.com/start-keyword?excludenudity=true&mediatype=video
Для перехода по ссылке вводим следующую конструкцию:

Код:
Tab tab = instance.ActiveTab;
tab.Navigate(parseUrl, ""); //Переходим по ссылке
 
Последнее редактирование:
  • Спасибо
Реакции: doc

Nord

Client
Регистрация
22.03.2012
Сообщения
2 375
Благодарностей
1 436
Баллы
113
{-Variable.varOne-}
замени на
project.Variables["varOne"].Value
и тд по аналогии
Чтоб не заводить новые переменные. Просто в коде везде замени на такой вид переменных
 
  • Спасибо
Реакции: romasa464

romasa464

Client
Регистрация
18.06.2017
Сообщения
69
Благодарностей
12
Баллы
8
Друзья, возник ещё один вопрос. Нужно сравнить 2 строковых переменных.
Т.е. присутствует переменная:

Код:
string myVariable = vertical;
Нужно прописать логику сравнения, аля: если переменная myVariable равна vertical, то мы выполняем некоторый код, а именно:

Код:
//Тут объявляю нужные переменные

string strMediatype = project.Variables["mediaType"].Value; //Переменная со значением типа изображения
string twoTypeS;

//Сама логика

if (strMediatype = "illustration")
twoTypeS = "illustrations/";
Но в PM выдаёт такую ошибку:

Код:
18:12:03    Компиляция кода  Ошибка в действии "CS0029" "Неявное преобразование типа "string" в "bool" невозможно". [Строка: 16; Cтолбец: 5]
Помогите разобраться, пожалуйста.
 

Nord

Client
Регистрация
22.03.2012
Сообщения
2 375
Благодарностей
1 436
Баллы
113
Друзья, возник ещё один вопрос. Нужно сравнить 2 строковых переменных.
Т.е. присутствует переменная:

Код:
string myVariable = vertical;
Нужно прописать логику сравнения, аля: если переменная myVariable равна vertical, то мы выполняем некоторый код, а именно:

Код:
//Тут объявляю нужные переменные

string strMediatype = project.Variables["mediaType"].Value; //Переменная со значением типа изображения
string twoTypeS;

//Сама логика

if (strMediatype = "illustration")
twoTypeS = "illustrations/";
Но в PM выдаёт такую ошибку:

Код:
18:12:03    Компиляция кода  Ошибка в действии "CS0029" "Неявное преобразование типа "string" в "bool" невозможно". [Строка: 16; Cтолбец: 5]
Помогите разобраться, пожалуйста.
в IFе не "=", а "=="
 

romasa464

Client
Регистрация
18.06.2017
Сообщения
69
Благодарностей
12
Баллы
8
Да, заметил ошибку. Но есть новый вопрос. Эта конструкция отрабатывает, и присваивает новой переменной значение, но, эта переменная не работает за пределами конструкции IF.

Как сделать её видимой?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 614
Благодарностей
4 601
Баллы
113
Да, заметил ошибку. Но есть новый вопрос. Эта конструкция отрабатывает, и присваивает новой переменной значение, но, эта переменная не работает за пределами конструкции IF.

Как сделать её видимой?
может поищешь в интернете какую-то книжку по азам c#?
 
  • Спасибо
Реакции: ZHAG и romasa464

romasa464

Client
Регистрация
18.06.2017
Сообщения
69
Благодарностей
12
Баллы
8
может поищешь в интернете какую-то книжку по азам c#?
Азы, в общем, я изучил. В таких случаях нужно объявлять переменную до конструкции if. Чтобы впоследствии можно было её использовать и за пределами.
Например, вот так:

Код:
string one = "onetext";
string two = null;

if(one == "onetext") two = "fuking sucess!";

return two;
Запускаю данный код в PM - и оно работает. Однако, стоит запустить тождественный с синтаксической точки зрения код:

Код:
string strMediatype = project.Variables["mediaType"].Value; //Переменная со значением типа изображения
string two = null;

//Сама логика
if (strMediatype == "illustration") two = "illustrations/";

return two;
И вот что мне выдаёт:

Код:
Выполнение действия CSharp OwnCode Ссылка на объект не указывает на экземпляр объекта.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 614
Благодарностей
4 601
Баллы
113
горжусь тобой)
В сниппетах зеннопостера нельзя возвращать null. Таким образом твой сниппет вернёт либо "illustrations/" либо выбьет ошибку. Вместо null используй пустоту "" или string.Empty
 
  • Спасибо
Реакции: romasa464

romasa464

Client
Регистрация
18.06.2017
Сообщения
69
Благодарностей
12
Баллы
8
горжусь тобой) Таким образом твой сниппет вернёт либо "illustrations/" либо выбьет ошибку. Вместо null используй пустоту "" или string.Empty
Спасибо огромное :3
В сниппетах зеннопостера нельзя возвращать null.
Вот об этом я и не знал, увы. И нагуглить не смог. Перерыл все справки майкрософта, документацию зеннолаба и ютуб. И вот оно решение.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 614
Благодарностей
4 601
Баллы
113
Спасибо огромное :3

Вот об этом я и не знал, увы. И нагуглить не смог. Перерыл все справки майкрософта, документацию зеннолаба и ютуб. И вот оно решение.
нередко такой return используют для намеренного вызова ошибки. Позволяет расширять логику с# кубика, когда можно пойти от него по разным веткам
 

romasa464

Client
Регистрация
18.06.2017
Сообщения
69
Благодарностей
12
Баллы
8
нередко такой return используют для намеренного вызова ошибки. Позволяет расширять логику с# кубика, когда можно пойти от него по разным веткам
Извините, у меня есть вопрос, буду рад, если вы подскажите.

В общем, наваял я вот такой код:

Код:
var saveCount = 150; //Переменная необходимого количества постов из входных настроек
var currentCount = 0;
while (currentCount < saveCount)
{  
        //Собираем коллекцию элементов
        var saveImage = instance.ActiveTab.FindElementsByAttribute("article", "class", "mosaic-asset", "regexp");  
        //Присваиваем переменной currentCount количество найденных элементов в коллекции
        currentCount=saveImage.Count;
        //Ищем кнопку перехода на новую страницу
        HtmlElement nextClick = tab.FindElementByAttribute("a", "id", "next-gallery-page", "regexp", 0);
        //Кликаем на кнопку для перехода
        nextClick.RiseEvent("click", "Full");
        //Ждём пока страница загрузится
        instance.ActiveTab.WaitDownloading();
}
В общем, идея такова: Я задаю количество элементов которые мне нужно спарсить и данная логика сравнивает сколько элементов на данный момент есть в коллекции. Если элементов меньше - он повторяет цикл (занося при каждом шаге новые элементы в коллекцию). Сперва переменная currentCount равна нулю. Естественно цикл делает проход, кладёт в коллекцию 60 элементов и выходит на второй повтор цикла, т.к. условие таково, что цикл выполняется до того момента пока currentCount меньше 150. Идя по циклу, софт кликает на новую страницу, собирая элементы оттуда. По идее, при каждом переходе на новую страницу он должен добавлять к коллекции ещё 60 элементов, и после трёх повторов цикл должен остановиться.

Проблема в том, что цикл не останавливается, и крутится до бесконечности. А в переменную счётик при каждом проходе записывается 60, т.е. получается что он затирает предыдущее значение и записывает туда новое. Есть предположение, что это из-за того, что он каждый раз переходит на новую страницу и из-за этого предыдущие данные по коллекции затираются.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 614
Благодарностей
4 601
Баллы
113
Извините, у меня есть вопрос, буду рад, если вы подскажите.

В общем, наваял я вот такой код:

Код:
var saveCount = 150; //Переменная необходимого количества постов из входных настроек
var currentCount = 0;
while (currentCount < saveCount)
{ 
        //Собираем коллекцию элементов
        var saveImage = instance.ActiveTab.FindElementsByAttribute("article", "class", "mosaic-asset", "regexp"); 
        //Присваиваем переменной currentCount количество найденных элементов в коллекции
        currentCount=saveImage.Count;
        //Ищем кнопку перехода на новую страницу
        HtmlElement nextClick = tab.FindElementByAttribute("a", "id", "next-gallery-page", "regexp", 0);
        //Кликаем на кнопку для перехода
        nextClick.RiseEvent("click", "Full");
        //Ждём пока страница загрузится
        instance.ActiveTab.WaitDownloading();
}
В общем, идея такова: Я задаю количество элементов которые мне нужно спарсить и данная логика сравнивает сколько элементов на данный момент есть в коллекции. Если элементов меньше - он повторяет цикл (занося при каждом шаге новые элементы в коллекцию). Сперва переменная currentCount равна нулю. Естественно цикл делает проход, кладёт в коллекцию 60 элементов и выходит на второй повтор цикла, т.к. условие таково, что цикл выполняется до того момента пока currentCount меньше 150. Идя по циклу, софт кликает на новую страницу, собирая элементы оттуда. По идее, при каждом переходе на новую страницу он должен добавлять к коллекции ещё 60 элементов, и после трёх повторов цикл должен остановиться.

Проблема в том, что цикл не останавливается, и крутится до бесконечности. А в переменную счётик при каждом проходе записывается 60, т.е. получается что он затирает предыдущее значение и записывает туда новое. Есть предположение, что это из-за того, что он каждый раз переходит на новую страницу и из-за этого предыдущие данные по коллекции затираются.
Всё верно. Если тебя интересуют какие-то конкретные данные, а не целые Html элементы, объяви список текстовый до цикла. В цикле в него добавляй нужные данные. И в цикле для проверки бери количество записей этого списка.
 
  • Спасибо
Реакции: romasa464

romasa464

Client
Регистрация
18.06.2017
Сообщения
69
Благодарностей
12
Баллы
8
Всё верно. Если тебя интересуют какие-то конкретные данные, а не целые Html элементы, объяви список текстовый до цикла. В цикле в него добавляй нужные данные. И в цикле для проверки бери количество записей этого списка.
Спасибо огромное, завтра попробую! А список, это обычный список? И в него затем класть строками результаты и через .Count считать количество строк?

И, если вам не в тягость, буду весьма благодарен если поможете с проблемой. Проблема следующая:

1. Во входных настройках выбирается путь к файлу с аккаунтами, соответственно, этот путь ложится в переменную
2. Создаётся список к которому нужно в дальнейшем привязать этот файл

Соответственно, нужно переменную с путём к файлу положить в список так, чтобы она отработалась. Одно важное условие. Нужно всё это реализовать через C# сниппет. Как это сделать?

И ещё, как обработать взятую строку вида login:password при помощи С# так, чтобы строка разделялась, и login ложился в одну переменную, а password в другую.

P.S. если кому нужно по поводу разделения строк через разделитель работает вот этот код:
Код:
IZennoList emailInputtt = project.Lists["emailInput"];
string[] emailLoginPair = emailInputtt[0].Split(':');
string emailLogin = emailLoginPair[0];
string emailPassword = emailLoginPair[1];
Т.е. создаём массив-список, далее, делим каждую строку по разделителю и кладём в переменные.
 

romasa464

Client
Регистрация
18.06.2017
Сообщения
69
Благодарностей
12
Баллы
8
И ещё такой вопрос по этому коду:
Код:
IZennoList emailInputtt = project.Lists["emailInput"];
string[] emailLoginPair = emailInputtt[0].Split(':');
string emailLogin = emailLoginPair[0];
string emailPassword = emailLoginPair[1];
Как сделать так, чтобы он брал эти строки с удалением.

Вопрос номер 2:

Как взять и положить из списка строку с удалением?
В списке не нужно делить строки. Просто взять содержимое первой строки, положить её в переменную, удалить из списка.
 

romasa464

Client
Регистрация
18.06.2017
Сообщения
69
Благодарностей
12
Баллы
8
Всё верно. Если тебя интересуют какие-то конкретные данные, а не целые Html элементы, объяви список текстовый до цикла. В цикле в него добавляй нужные данные. И в цикле для проверки бери количество записей этого списка.
Проблема в том, что цикл не останавливается, и крутится до бесконечности. А в переменную счётик при каждом проходе записывается 60, т.е. получается что он затирает предыдущее значение и записывает туда новое. Есть предположение, что это из-за того, что он каждый раз переходит на новую страницу и из-за этого предыдущие данные по коллекции затираются.
Если кому интересно, нашёл простое решение, было так:
Код:
 currentCount=saveImage.Count;
И в счётчик currentCount постоянно записывалось значение saveImage.Count, которое обнулялось при каждом круге и всегда было равно 60.
А нужно сделать так:
Код:
 currentCount+=saveImage.Count;
В таком случае, в currentCount будет записываться значение полученное на первом круге, и при каждом новом, оно будет приплюсовывать значение последующего. Таким образом, цикл отрабатывает как нужно.
 

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