- Регистрация
- 23.07.2020
- Сообщения
- 230
- Благодарностей
- 72
- Баллы
- 28
Проблема заключается в том, что если шаблон запустить с начала, то последний кубик с датой не отработает. А если после уже отработанного запустить последний кубик, то он то дату введе + месяц, то просто дату.
В общем реально не понятное поведение.
Я ужу try catch везде пробовал ставить - ни чего конкретного не нашел
.
В какую сторону копать?
Кубик с прокси отцепил от общей логики, чтобы можно было сразу после скачивания запустить.
UPD: 00:27 17.03.2021 изменил шаблон, был найден недочет.
UPD: 01:05 17.03.2021 Решение: Оказывается, elLiItemDate хранит в памяти не элемент, а ссылку на элемент. И если после нажатия на кнопку изменяется структура DOM дерева, то ссылка теряет актуальность и ее надо обновить.
Получается у меня была недействительная ссылка и в связи с чем поведение шаблона было неоднозначным, и после запуска кубика (последнего) ссылка обновлялась и все работало 
Так же в коде форучанин нашел кучу ошибок
В общем реально не понятное поведение.
Я ужу try catch везде пробовал ставить - ни чего конкретного не нашел

В какую сторону копать?
Сам код проблемного кубика:
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);

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

Вложения
-
17,3 КБ Просмотры: 60
Последнее редактирование: