Логика кубиков С# постоянно не находит что-то. Возможно весь момент в логике,

nikita666

Новичок
Регистрация
15.11.2024
Сообщения
3
Благодарностей
0
Баллы
1
Всем добрый день! Автоматизацией начал заниматься с лета. И часто появляются ошибки, потом вопросы, пробы, слезы и прочее. Без ошибок никуда, понимаю. Но задумался, возможно я просто чуть усложняю или упускаю какой то важный момент, из-за которого во всех шаблонах периодически появляются ошибки и мне нужно их править.

И ВОПРОС, не в решении проблемы, а хочется получить советы от профи - корректно ли я строю логику кубиков и в принципе шаблона. Вот.

Скинул примеры пары кубиков c# и самих шаблонов.

1.
C#:
// проверка выполнения квеста. Проверяет див, который выделяет зеленым весь элемент
    HtmlElement check = CommonCode.CheckElement("//div[contains(., 'Follow @WalrusProtocol on Twitter')]/div[contains(@class, 'bg-success')]", instance);
    if(!check.IsVoid)
    {
        project.SendInfoToLog("Квест выполнен!");
        return check;
    }

project.SendInfoToLog("Квест не выполнен! Иду делать!");
// приступаю делать квест по порядку. Всего заданий 5.
for (int i = 0; i < 3; i++)
{
    // жмет кнопки
    CommonCode.Click("//p[text()='Follow @WalrusProtocol on Twitter']", instance);
    System.Threading.Thread.Sleep(20000);
    
    HtmlElement tw = CommonCode.CheckElement("//button[@data-testid='confirmationSheetConfirm']", instance);
    if(!tw.IsVoid)
    {
        CommonCode.Click("//button[@data-testid='confirmationSheetConfirm']", instance);
        // закрываю вкладку и на всякий случай активирую Galxe
        Tab tab = instance.ActiveTab;
        tab.Close();   
        Tab tab1 = instance.GetTabByAddress("galxe");
        tab1.SetActive();
        project.SendInfoToLog("Вернулся со страницы твитера на Галку!");
    }
    else
    {
        project.SendInfoToLog("Проблемы с твитером!");
        Tab tab = instance.ActiveTab;
        tab.Close();   
        Tab tab1 = instance.GetTabByAddress("galxe");
        tab1.SetActive();
    }
    System.Threading.Thread.Sleep(2000);
    
    System.Threading.Thread.Sleep(3000);
    CommonCode.Click("//p[text()='Follow @WalrusProtocol on Twitter']/following::button", instance);
    
    // пауза
    System.Threading.Thread.Sleep(5000);
    project.SendInfoToLog("Приступаю проверять квест после выполнения!");
    // проверка выполнения квеста
    HtmlElement check1 = CommonCode.CheckElement("//div[contains(., 'Follow @WalrusProtocol on Twitter')]/div[contains(@class, 'bg-success')]", instance);
    if(!check1.IsVoid)
        {
            project.SendInfoToLog("Квест выполнен!");
            break;
        }
        else
        {
            project.SendInfoToLog("Квест не выполнен!");
            System.Threading.Thread.Sleep(60000);
        }
    
    if(i == 3)
    {
        project.SendInfoToLog("Квест не получилось выполнить 3 раза!");
        throw new Exception("Квест не получилось выполнить 3 раза!");
    }
}
2.
C#:
// жму кнопки на странице
CommonCode.Click("//a[contains(text(), 'Get some $TOKEN')]", instance, 30);
CommonCode.Click("//span[text()='Sign in with']", instance, 30);
//пауза
System.Threading.Thread.Sleep(5000);

//после клика на странице твитера проверяю и отрабатываю кнопку
HtmlElement fail = CommonCode.CheckElement("//div[@id='ScriptLoadFailure']", instance, 30);
if(!fail.IsVoid)
{
    CommonCode.Click("//button[@type='submit']", instance);
}
HtmlElement el = CommonCode.CheckElement("//button[@data-testid='OAuth_Consent_Button']", instance, 30);
if(!el.IsVoid)
{
    CommonCode.Click("//button[@data-testid='OAuth_Consent_Button']", instance, 30);
}
else
{
    throw new Exception("Не получается подключить Аркаду к твитеру! Завершаю работу!");
}

System.Threading.Thread.Sleep(10000);
CommonCode.Click("//span[text()='2) Follow']/following-sibling::button", instance, 30);
System.Threading.Thread.Sleep(10000);

Tab tab = instance.ActiveTab;
if ((tab.IsVoid) || (tab.IsNull)) return -1;
if (tab.IsBusy) tab.WaitDownloading();
tab.Navigate("https://arcade.soniclabs.com", "");
if (tab.IsBusy) tab.WaitDownloading();

//если все ок - то жму получить токены
CommonCode.Click("//a[contains(text(), 'Get some $TOKEN')]", instance, 30);

 

Alex91

Активный пользователь
Регистрация
15.08.2024
Сообщения
216
Благодарностей
60
Баллы
28
Почему между кликами нет пауз ?
Почему где то 5 секунд, а где то 60 секунд пауза ?
Почему не используется ожидание элементов ?
Почему нет логирования после каждого действия ?
Причина использования глючного WaitDownloading ?
Причина работы в c# , а не на кубиках ?
 
  • Спасибо
Реакции: nikita666

nikita666

Новичок
Регистрация
15.11.2024
Сообщения
3
Благодарностей
0
Баллы
1
-
Почему между кликами нет пауз ?
Почему где то 5 секунд, а где то 60 секунд пауза ?
Почему не используется ожидание элементов ?
Почему нет логирования после каждого действия ?
Причина использования глючного WaitDownloading ?
Причина работы в c# , а не на кубиках ?
- паузы ставлю. Но не обращал внимания, что клики могут идти подряд. принял.
- паузы разные по причине, что в разных местах происходит по разному обновление данных. и ставлю по максимуму. А как лучше это реализовать? Если указали, то я как понимаю в этом есть некая ошибка у меня.

- вот такое использую
C#:
// проверка видит ли элемент пользователь
        public static bool IsVisible(HtmlElement el)
        {
            if ((el.IsVoid) || (el.IsNull)) return false;
            if (el.Width > 0 && el.Height > 0 && el.DisplacementInBrowser.Y > 0 && el.DisplacementInBrowser.Y > 0)
            {
                System.Threading.Thread.Sleep(1 * 500);
                return true;
            }
            else return false;
        }

        // Чекер элемента
        public static HtmlElement CheckElement(string xPath, Instance instance, int counter = 15, int numEl = 0)
        {
            //Выбираем активную вкладку
            Tab tab = instance.ActiveTab;

            // создаем html элемент void
            HtmlElement el = tab.FindElementByXPath("/Scrollwtfmandrop", 0);

            //проверяем вкладку на ошибки
            if ((tab.IsVoid) || (tab.IsNull)) return el;

            //Ждем когда страница полностью загрузится
            if (tab.IsBusy) tab.WaitDownloading();

            for (int i = 0; i < counter; i++)
            {
                el = tab.FindElementByXPath(xPath, numEl);
                if (CommonCode.IsVisible(el)) return el;
                System.Threading.Thread.Sleep(1 * 1000);
            }
            return el;
        }
- почему то не использую... принял
- на таком научили. Если есть чем это можно заменить - буду благодарен если распишите.
- c# - не все можно реализовать на кубиках, те же формулы применять и прочее. и упрощение самого шаблона. Вот тут если у Вас есть что детальнее рассказать, я с большим удовольствием послушаю, так как задачей является перейти только на c#.
 

Alex91

Активный пользователь
Регистрация
15.08.2024
Сообщения
216
Благодарностей
60
Баллы
28
Вместо фиксированных пауз, надо использовать ожидание появления нужного элемента. Дождались, в лог. Не дождалимь , в лог. Логирование естественно должно быть отключаемым из входных настроек проекта.
WaitDownloading нельзя использовать. Если не отключишь в нем ожидание всего лишнего, будет висеть слишком долго или бесконечно, при ajax запросах, а если отключишь, то динамические элементы он не дождется и продолжит работу и твой код без ожидания контрольного элемента влетит в ошибку поиска элемента, тупо по непрогрузу страницы.

Вообще убери его во всем коде и никогда не используй. Поищи на форуме код ожидания элементов, этого добра как грязи тут. Да и в конкурсных было много статей на эту тему. Освоишь и фиксированные паузы не будут нужны вообще.
 
  • Спасибо
Реакции: nikita666

nikita666

Новичок
Регистрация
15.11.2024
Сообщения
3
Благодарностей
0
Баллы
1
Вместо фиксированных пауз, надо использовать ожидание появления нужного элемента. Дождались, в лог. Не дождалимь , в лог. Логирование естественно должно быть отключаемым из входных настроек проекта.
WaitDownloading нельзя использовать. Если не отключишь в нем ожидание всего лишнего, будет висеть слишком долго или бесконечно, при ajax запросах, а если отключишь, то динамические элементы он не дождется и продолжит работу и твой код без ожидания контрольного элемента влетит в ошибку поиска элемента, тупо по непрогрузу страницы.

Вообще убери его во всем коде и никогда не используй. Поищи на форуме код ожидания элементов, этого добра как грязи тут. Да и в конкурсных было много статей на эту тему. Освоишь и фиксированные паузы не будут нужны вообще.
Спасибо большое! Пошел учиться дальше
 

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