Не могу выставить дату при регистрации в ВК с использование эмуляции

bigloafer

Client
Регистрация
23.07.2020
Сообщения
241
Благодарностей
75
Баллы
28
Проблема заключается в том, что если шаблон запустить с начала, то последний кубик с датой не отработает. А если после уже отработанного запустить последний кубик, то он то дату введе + месяц, то просто дату.
В общем реально не понятное поведение.

Я ужу try catch везде пробовал ставить - ни чего конкретного не нашел :be: .

В какую сторону копать?

Сам код проблемного кубика:
Tab tab1 = instance.ActiveTab;    //    Выбор активной вкладки

string tmpRes = string.Empty;
var rnd = new Random();
int iChance = 0;                //    Вероятность выбора поведения
int iFindElement = 0;            //     Номер элемента по которому надо сделать клик

//    Месяца
string[,] arrMonth = {
    {"1","Января"},
    {"2", "Февраля"},
    {"3","Марта"},
    {"4", "Апреля"},
    {"5","Мая"},
    {"6", "Июня"},
    {"7","Июля"},
    {"8", "Августа"},
    {"9","Сентября"},
    {"10", "Октября"},
    {"11","Ноября"},
    {"12", "Декабря"}
};

// Создаем лист для последующего перебора
// *********************************************************
List<string> lstBirthdate = new List<string>() {};
lstBirthdate.Add("ij_bday");
lstBirthdate.Add("ij_bmonth");
lstBirthdate.Add("ij_byear");

for (int i = 0; i < lstBirthdate.Count; i++) {
    project.SendInfoToLog(lstBirthdate[i] + " work");

    // Формирование строк для xPath
    // *********************************************************
    string divBoxLink = String.Format(@"//div[contains([USER=46442]class[/USER], '{0}')]", lstBirthdate[i]);                                // div link для открытия скролла для выбора позиции
    string liItemDate = String.Format(@"{0}/descendant::div[contains([USER=46442]class[/USER], 'result_list')]/ul/li", divBoxLink);        // item


    // Присвоение данных переменным - сверка для определения выбора
    if (lstBirthdate[i] == "ij_bday") {
        tmpRes = project.Profile.BornDay.ToString();
    } else if (lstBirthdate[i] == "ij_bmonth") {
        for(int indexMonth = 0; indexMonth < arrMonth.Length/2; indexMonth++) {
            if (project.Profile.BornMonth.ToString() == arrMonth[indexMonth, 0].ToString()) {
                tmpRes = arrMonth[indexMonth, 1].ToString();
                break;
            }
        }
    } else if (lstBirthdate[i] == "ij_byear") {
        tmpRes = project.Profile.BornYear.ToString();
    }

    // Находим элементы по xPath
    // *********************************************************
    HtmlElement elDivBoxLink = tab1.FindElementByXPath(divBoxLink, 0);
    HtmlElement elLiItemDate = tab1.FindElementByXPath(liItemDate, 0);

    // Клик по окну
    tab1.FullEmulationMouseSetOptions(rnd.Next(4,7), rnd.Next(4,7), rnd.Next(5,11));
    tab1.FullEmulationMouseMoveToHtmlElement(elDivBoxLink);
    tab1.FullEmulationMouseClick("left", "click");


    //    Собираем коллекцию возможных вариантов для выбора из появщегося меню
    HtmlElementCollection colBornDay = tab1.FindElementsByXPath(liItemDate);

    //    Ищем элемент по путем сверки с innertext
    for (int x = 0; x < colBornDay.Count(); x++) {
        if (colBornDay.GetByNumber(x).InnerText == tmpRes) {
            iFindElement = x;
            project.SendInfoToLog("В коллекции " + colBornDay.Count.ToString() + " элементов!");
            project.SendInfoToLog("Нужный элемент находиться на позиции: " + iFindElement.ToString());
            break;
        }
    }

    HtmlElement BornDaySelectIndex = tab1.FindElementByXPath(liItemDate, iFindElement);    // <li> на который надо прицелиться и кликнуть
    if(!BornDaySelectIndex.IsVoid) {
        project.SendInfoToLog("Элемент не найден!");
    }

    //    Расчет пунктов скролла
    int x_ltb = int.Parse(elLiItemDate.GetAttribute("leftinbrowser"));
    int y_ltb = int.Parse(elLiItemDate.GetAttribute("topinbrowser"));
    int pos_x = rnd.Next(x_ltb, x_ltb + elLiItemDate.Width);
    int pos_y = rnd.Next(y_ltb, y_ltb + elLiItemDate.Height);
    int iPointScroll = iFindElement * elLiItemDate.Height;
        
    //    Скролл внутри появляющегося бокса
    tab1.FullEmulationMouseSetOptions(rnd.Next(4,7), rnd.Next(4,7), rnd.Next(5,11));
    tab1.FullEmulationMouseMove(pos_x, pos_y);
    tab1.FullEmulationMouseWheel(0, iPointScroll);

    // Выбор элемента и клик по нему
    tab1.FullEmulationMouseSetOptions(rnd.Next(4,7), rnd.Next(4,7), rnd.Next(5,11));
    tab1.FullEmulationMouseMoveToHtmlElement(BornDaySelectIndex);
    tab1.FullEmulationMouseClick("left", "click");

}
Кубик с прокси отцепил от общей логики, чтобы можно было сразу после скачивания запустить.

UPD: 00:27 17.03.2021 изменил шаблон, был найден недочет.
UPD: 01:05 17.03.2021 Решение: Оказывается, elLiItemDate хранит в памяти не элемент, а ссылку на элемент. И если после нажатия на кнопку изменяется структура DOM дерева, то ссылка теряет актуальность и ее надо обновить.
C#:
HtmlElement elLiItemDate = tab1.FindElementByXPath(liItemDate, 0);
Получается у меня была недействительная ссылка и в связи с чем поведение шаблона было неоднозначным, и после запуска кубика (последнего) ссылка обновлялась и все работало :-)

Так же в коде форучанин нашел кучу ошибок ;-)
 

Вложения

Последнее редактирование:

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