Icon

Dev: как отлаживать Easy Apply Bot

Узнайте, как находить и исправлять ошибки в боте Reapplied, используя продуктовую базу, AdPower и отладку через Selenium и Action Chains. Подробный гайд по тестированию и дебагу вакансий на LinkedIn.

By Miroslav Peshkov

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

Далее мы пройдём процесс запуска тестов, включения режима дебага и поиска решений для типовых ошибок, таких как некликабельные кнопки. Это поможет понять, как выявлять и устранять проблемы в автоматизации подачи заявок.

Давайте начнём

Привет! Сейчас объясню, как дебажить и тестировать из reapplied бота. Итак, сначала нужно найти вакансии для клиента, в которых были ошибки. Заходим в продуктовую базу.

1
Кликните на "https://www.linkedin.com/job/view/4383312740 Business Analyst"
Step #1: Кликните на "https://www.linkedin.com/job/view/4383312740 Business Analyst"

Табличка Apply bot попытка.

2
Кликните на "→ https://www.linkedin.com/jobs/view/4282186747"
Step #2: Кликните на "→ https://www.linkedin.com/jobs/view/4282186747"

Мы можем выбрать Minty ID и тип бота, чтобы посмотреть причины ошибок. Вот я хочу разобраться, что это такое — not clickable из reapplied. Почему так происходит? Я беру вакансию, затем перехожу в ENV.

3
Дважды кликните на "//www.linkedin.com/jobs/view/4282186747"
Step #3: Дважды кликните на "//www.linkedin.com/jobs/view/4282186747"
4
Введите "Cmd + C"
5
Кликните на "NVIRONMENT = " test ""
Step #5: Кликните на "NVIRONMENT = " test ""

Я уже все это вставил.

6
Кликните на "SÅview"
Step #6: Кликните на "SÅview"
7
Кликните на "//www.linkedin.com/jobs/view/4383304372 ""
Step #7: Кликните на "//www.linkedin.com/jobs/view/4383304372 ""

Вот эту вакансию берем.

8
Кликните на "ww.linkedin.com/jobs/view/4383304372"
Step #8: Кликните на "ww.linkedin.com/jobs/view/4383304372"

Указываю пять семь четыре дополнительных клиента.

9
Кликните на "ENTEE_TO_TEST = 574"
Step #9: Кликните на "ENTEE_TO_TEST = 574"

Все!

10
Дважды кликните на "I"
Step #10: Дважды кликните на "I"

Environment.

11
Кликните здесь
Step #11: Кликните здесь

Test. Огонь! У нас готовы ENV для дебага. Далее. Я должен открыть у себя локально AdPower.

Это наш антидетект-браузер. Откройте профиль клиента, с которым мы будем работать. Мы видим сейчас, что у нас Minty ID 574.

12
Кликните на ")"
Step #12: Кликните на ")"
13
Кликните на "57"
Step #13: Кликните на "57"
14
Введите "Cmd + C"
15
Введите "Cmd + C"
16
Дважды кликните на "574"
Step #16: Дважды кликните на "574"
17
Дважды кликните на "574"
Step #17: Дважды кликните на "574"
18
Введите "Cmd + C"
19
Кликните здесь
Step #19: Кликните здесь
20
Кликните здесь
Step #20: Кликните здесь
21
Кликните на "I"
Step #21: Кликните на "I"
22
Введите "mentee"
23
Дважды кликните на "57"
Step #23: Дважды кликните на "57"
24
Введите "Enter"
25
Кликните на "✰ Angelina Matamoros"
Step #25: Кликните на "✰ Angelina Matamoros"
26
Дважды кликните на "Angelina Matamoros"
Step #26: Дважды кликните на "Angelina Matamoros"

По-питоновски, да, пишется через нижнее подчеркивание с маленькой буквы. Ну вот, я нашел. В целом у меня... ага, нужно открыть. Давайте откроем.

27
Кликните на "open"
Step #27: Кликните на "open"

Вот я открываю браузер. То есть в этом браузере будет происходить отладка.

28
Кликните здесь
Step #28: Кликните здесь

Вот огонь!

29
Кликните на "⑪ Strategic Francial Planning & X"
Step #29: Кликните на "⑪ Strategic Francial Planning & X"

Хорошо. Далее переходим в наш проект и открываем тесты.

30
Кликните здесь
Step #30: Кликните здесь
31
Кликните здесь
Step #31: Кликните здесь

Тесты.

32
Кликните здесь
Step #32: Кликните здесь
33
Кликните здесь
Step #33: Кликните здесь

Run test Minty, и, по сути, это эн ту энд тест, который запускает весь флоу на одном клиенте.

34
Дважды кликните на "run_test_mentee.py"
Step #34: Дважды кликните на "run_test_mentee.py"
35
Кликните на "I"
Step #35: Кликните на "I"
36
Кликните на "I"
Step #36: Кликните на "I"

Что мы делаем? Мы спускаемся вниз и просим включить режим отладки.

37
Щёлкните правой кнопкой на "213 if"
Step #37: Щёлкните правой кнопкой на "213 if"
38
Кликните на "I"
Step #38: Кликните на "I"
39
Кликните на "if not test_mentee_id or not test_job_url : args = parse_args ( )"
Step #39: Кликните на "if not test_mentee_id or not test_job_url : args = parse_args ( )"

Вот сейчас у меня задача: я обнаружил ошибку, из-за которой мы не могли кликнуть на кнопку Вот.

40
Кликните на "►"
Step #40: Кликните на "►"
41
Дважды кликните на "pt / linkedin / pages"
Step #41: Дважды кликните на "pt / linkedin / pages"

И покажу, как я ее решил. Я ее решил... Ммм. Так, наверное, не тут.

42
Кликните на "base.py bot / linkedin / pages"
Step #42: Кликните на "base.py bot / linkedin / pages"
43
Кликните на "base.py bot / linkedin / pages"
Step #43: Кликните на "base.py bot / linkedin / pages"

Вот тут. Так, так, так. Да, вот здесь. То есть у нас была обычная кнопка-клик, селениумовская, но она не работала.

44
Кликните на "logger.info ("
Step #44: Кликните на "logger.info ("
45
Перетащите "logger.info ( f " { label }"
Step #45: Перетащите "logger.info ( f " { label }"
46
Кликните на "infol"
Step #46: Кликните на "infol"
47
Кликните на "ActionChains"
Step #47: Кликните на "ActionChains"

Я добавил с помощью Action Chains. Нужно, чтобы он навёл мышку на этот элемент и кликнул. И на основной фулбэк я сделал клик через GS. Но это крайний случай, потому что... Потому что я не хочу, чтобы у нас программа работала через обычный GS.

48
Кликните на "logger.warning ("
Step #48: Кликните на "logger.warning ("
49
Кликните на "I"
Step #49: Кликните на "I"
50
Кликните на "" arguments"
Step #50: Кликните на "" arguments"

Это будет еще один повод нас забанить.

51
Кликните на "Commit base.py x"
Step #51: Кликните на "Commit base.py x"

Сами понимаете, есть разница: когда вы наводите мышку и кликаете кнопку, или когда JavaScript-код выполняет клик внутри. LinkedIn, возможно, это отслеживает, и это не очень хорошо.

52
Кликните на "I"
Step #52: Кликните на "I"

Поэтому нам нужно это протестировать.

53
Кликните здесь
Step #53: Кликните здесь

Отлично! Вот у меня здесь дебаггер.

54
Кликните здесь
Step #54: Кликните здесь

Ну, погнали дальше. Все, он сейчас должен что-то делать.

55
Кликните на "Console"
Step #55: Кликните на "Console"

Откроем консоль. Ну да, он здесь собирает разные данные о клиенте.

56
Кликните здесь
Step #56: Кликните здесь
57
Кликните здесь
Step #57: Кликните здесь

Я проверял, что все работает. В целом, можно отжать.

58
Кликните здесь
Step #58: Кликните здесь
59
Кликните здесь
Step #59: Кликните здесь
60
Кликните на "easy_apply_config = easy_apply_config"
Step #60: Кликните на "easy_apply_config = easy_apply_config"

Хм. Так как мы хотим проверить, является ли это базисом, нам нужно перейти на страницу LinkedIn.

61
Кликните на "Commit"
Step #61: Кликните на "Commit"
62
Кликните здесь
Step #62: Кликните здесь
63
Кликните здесь
Step #63: Кликните здесь
64
Кликните здесь
Step #64: Кликните здесь

Вот база страниц LinkedIn.

65
Кликните здесь
Step #65: Кликните здесь
66
Кликните здесь
Step #66: Кликните здесь
67
Дважды кликните на "▸base.py"
Step #67: Дважды кликните на "▸base.py"

Вот здесь можно поставить дебаггер.

68
Кликните здесь
Step #68: Кликните здесь
69
Кликните на "I"
Step #69: Кликните на "I"

Чтобы здесь остановиться. Вот. Ну, по логам можно увидеть, что происходит. И так далее.

70
Кликните на "Successfully_applied_job"
Step #70: Кликните на "Successfully_applied_job"

Вот. Easy Apply Jobs.

71
Кликните здесь
Step #71: Кликните здесь

Все, кликаем. Вот Easy Apply.

72
Кликните здесь
Step #72: Кликните здесь

Тут далее будут валидации.

73
Кликните здесь
Step #73: Кликните здесь
74
Кликните на "I"
Step #74: Кликните на "I"

Нам они, наверное, не так важны. Вот для нас важнее понять, заработает ли у нас кнопка. Ну вот, видим, что всё подгрузилось. И сейчас будут проходить длительные проверки на открытие различных форм, чтобы нас не разлогинило и так далее.

75
Кликните на "self._open_easy_apply_form ("
Step #75: Кликните на "self._open_easy_apply_form ("
76
Кликните на "I"
Step #76: Кликните на "I"
77
Кликните на "I"
Step #77: Кликните на "I"
78
Кликните на "I"
Step #78: Кликните на "I"

Тут подождем. Вот, кстати, да.

79
Кликните на "I"
Step #79: Кликните на "I"

И по поводу рефакторинга на будущее — непонятно, что здесь происходит.

80
Перетащите "using default timeout :"
Step #80: Перетащите "using default timeout :"

Я думаю, что сейчас программа определяет, истекла ли вакансия, не истекла, залогинены ли мы в браузере или нет.

81
Кликните на "Job to navigate to"
Step #81: Кликните на "Job to navigate to"

Проверяет, действительно ли это легкая вакансия. Но мы видим, что появляются какие-то тайм-аут эксепшны.

82
Кликните на "Time putException"
Step #82: Кликните на "Time putException"

Непонятно, зачем они нужны. Мы уже минуту там ждем, чтобы сделать проверки. Это удлиняет весь флоу подачи.

83
Кликните на "I"
Step #83: Кликните на "I"

Вот, по сути, если рефакторите это, нужно смотреть с дебаггером, проходить и понимать, какой элемент мы находим и почему он падает с тайм-аут эксепшеном.

84
Кликните на "I"
Step #84: Кликните на "I"

Ждем.

85
Кликните на "I"
Step #85: Кликните на "I"
86
Кликните на "jobs"
Step #86: Кликните на "jobs"
87
Кликните на "T"
Step #87: Кликните на "T"

Вот, все.

88
Кликните на "apply"
Step #88: Кликните на "apply"
89
Кликните на "I"
Step #89: Кликните на "I"
90
Кликните на "try"
Step #90: Кликните на "try"

Вот супер! Вот открытая форма Easy Apply. Вот сейчас он должен пойти.

91
Кликните здесь
Step #91: Кликните здесь
92
Кликните здесь
Step #92: Кликните здесь
93
Кликните здесь
Step #93: Кликните здесь

Вот. Да, сделать и кликнуть на эту кнопку.

94
Кликните здесь
Step #94: Кликните здесь

Так, давай попробуем.

95
Кликните здесь
Step #95: Кликните здесь

Тук. Вот. И это я тоже исправил.

96
Кликните на "easy_button_selectors"
Step #96: Кликните на "easy_button_selectors"

Я добавил еще один путь, который точно сработает.

97
Кликните здесь
Step #97: Кликните здесь

Вот. Ну, можно подбажить это.

98
Кликните здесь
Step #98: Кликните здесь

Ну, я уже это сам, конечно, дебажил. Вот.

99
Кликните на "I"
Step #99: Кликните на "I"

Вот он пишет ??????? Ну ладно, так и сделаем.

100
Кликните здесь
Step #100: Кликните здесь
101
Кликните здесь
Step #101: Кликните здесь
102
Кликните на "except JobIsNotEasyException"
Step #102: Кликните на "except JobIsNotEasyException"
103
Кликните на "I"
Step #103: Кликните на "I"

Он никак не может найти эту кнопочку.

104
Кликните на "I"
Step #104: Кликните на "I"

Колд нот гет. Ну вот, он нашел. Вот как раз селектор. Что я здесь придумал? Я заметил, что когда вакансия открывается в попапе на LinkedIn, в ссылке есть параметр opensduiplayflow.true.

Вот такая фигня.

105
Кликните здесь
Step #105: Кликните здесь

И, соответственно, это изи плаг. Когда вакансия долго открыта, происходит редирект на другой сайт. Там для этой кнопки используется другой путь.

106
Кликните на "↓"
Step #106: Кликните на "↓"

Вот. И теперь нужно на нее кликнуть.

107
Кликните здесь
Step #107: Кликните здесь

Мы нашли ее, но нам нужно сделать клик.

108
Кликните на "laſſel"
Step #108: Кликните на "laſſel"
109
Кликните на "I"
Step #109: Кликните на "I"

Тут происходит какой-то джи эс.

110
Кликните здесь
Step #110: Кликните здесь
111
Кликните здесь
Step #111: Кликните здесь

Вооот.

112
Кликните здесь
Step #112: Кликните здесь

И вот в чем была ошибка. И вот элемент click intercept exception. И все плохо.

113
Кликните здесь
Step #113: Кликните здесь

У нас было очень много ошибок.

114
Кликните на "↓"
Step #114: Кликните на "↓"

Теперь мы перехватываем эту ошибку и пробуем сделать это через action chain.

115
Кликните здесь
Step #115: Кликните здесь
116
Кликните на "↓"
Step #116: Кликните на "↓"

И через экшен чейн у нас тоже не получилось.

117
Кликните здесь
Step #117: Кликните здесь

Почему там? Ну-ка, давай руками продебажим.

118
Перетащите "ActionChains"
Step #118: Перетащите "ActionChains"
119
Введите "Cmd + C"

Клик.

120
Кликните на "I"
Step #120: Кликните на "I"

Он даже не вывел ошибку.

121
Введите "Cmd + V"
122
Введите "Enter"

Ну вот и...

123
Кликните на ".move_to_element"
Step #123: Кликните на ".move_to_element"
124
Кликните на "bution"
Step #124: Кликните на "bution"
125
Кликните здесь
Step #125: Кликните здесь

фигня полная.

126
Кликните здесь
Step #126: Кликните здесь
127
Кликните здесь
Step #127: Кликните здесь
128
Кликните здесь
Step #128: Кликните здесь

То есть он не видит.

129
Кликните на "in Easy hoply"
Step #129: Кликните на "in Easy hoply"

Хотя... Вот.

130
Кликните здесь
Step #130: Кликните здесь

Хотя он должен был нажать.

131
Кликните на "Discard"
Step #131: Кликните на "Discard"

Ну, я сейчас дальше пойду дебажить. Такой вот флоу.

132
Кликните на "full mouse event chain ,"
Step #132: Кликните на "full mouse event chain ,"
133
Кликните на "menzee"
Step #133: Кликните на "menzee"

Мы можем открыть таблицу с Minty, выбрать пять семь четыре, увидеть имя, скопировать его, перейти в AdPower и вставить сюда.

134
Введите "Cmd + C"

Итак, в целом, можно весь процесс дебагать от начала до конца.

Dev: как отлаживать Easy Apply Bot