catapulta > 16-01-2018 12:10:49 |
Здравствуйте. Есть задача из питоновского скрипта запустить firefox, получить из js-скрипта результат, закрыть и так предположительно бесконечное число раз по таймеру Но браузер ломается ровно на 5 раз, иногда на 2. Говорит что firefox закрылся при запуске, предлагается запустить в безопасном режиме или очистить. При запуске в безопасном режиме достаточно просто закрыть браузер, чтобы все наладилось, но это действие требует присутствия пользователя, а нам нужен автоматический процесс. Версия Firefox 52. Что пробовали: 1. отключить в настройках запуск старой сессии 2. выбрать питоновскую функцию по закрытию (kill, terminate): она без флага /f (без принудительного завершения) не нужна 3. обратится к винапи, хандл окна питон находит правильно, сообщения WM_CLOSE, WM_DESTOY, WM_QUIT, WM_NCDESTOY отправляет, но они не выполняются 4 C:\WINDOWS\system32\cmd.exe /c taskkill.exe /f /t /im firefox.exe &cls &start firefox найденную здесь команду пробовали, чередуя ее с тасккилом (поскольку браузер следует закрыть после выполнения задачи) получили тоже самое, firefox на 5 раз отказалась запустится Вопрос: можно ли что-то настроить в самом браузере? Волшебный ключ, который позволит firefox не тащить из прошлой жизни что-то мешающее? Заранее спасибо |
okkamas_knife > 16-01-2018 13:56:09 |
а паузу воткнуть между убийством и запуском не? ну и по хорошему кто мешает добавить в скрипт закрытие фф после выполнения задачи? |
catapulta > 16-01-2018 14:31:24 |
Перед запуском стоит 10 секунд, перед закрытием стоит 4 секунды. Перезапускаю вручную, тоже пару секунд добавляет. Этого мало? Нужно около минуты? ФФ закрывается тасккилом с ключами /F /T /IM (или /PID вместо /IM, и так и так пробовали). Вкладки в браузере из js-кода можно закрыть, только если они были открыты другим окном. |
Журавлёва > 16-01-2018 14:56:23 |
Если Фаерфокс закрывать посредством убийства процесса, то он ничего не может никуда ничего сохранить, и он считает это аварийным завершением и начинает при запуске предлагать решения несуществующих проблем. То есть, закрывать надо через АПИ, длят того, чтобы он понял, что его закрыли крестиком правого верхнего угла, тогда его завершение будет штатное и он не будет ничего предлагать. ЗЫ Найдите окно и пошлите ему сочетании АЛТ+Ф4, тогда фаер завершится штатно, проверено сейчас.. |
mokujin > 16-01-2018 18:45:53 |
catapulta пишетC:\WINDOWS\system32\cmd.exe /c taskkill.exe /f /t /im firefox.exe &cls &start firefox
бгг, ты чего? этож тупо убивает процесс. Журавлёва все прально скзаала, тебе нужно не убивать , а закрыть нормально. Нечто типа такого №11479 , тут блокнот закрываеццо из VBcript . Что-то такое и нужно тебе сваять на питоне отставить, плохой пример. |
mokujin > 16-01-2018 19:58:13 |
Если это поможет. Есть такая чудная программка, консольная как положено, которая умеет то что нужно: закрыть окна по имени процесса. Ей 100летвобед но она шикарна: просто делаем pv -c firefox.exe и окно нормально закроется. попробуй. описание PV.EXE саму прогу могу залить, если нужна и не найдешь(там 72kB всего). |
Журавлёва > 16-01-2018 21:18:12 |
mokujin пишетЕсли это поможет.Есть такая чудная программка, консольная как положено, которая умеет то что нужно: закрыть окна по имени процесса. Ей 100летвобед но она шикарна: просто делаем pv -c firefox.exe и окно нормально закроется.попробуй. описание PV.EXE саму прогу могу залить, если нужна и не найдешь(там 72kB всего).
"Программки" нужно писать самостоятельно, тогда они будут работать по своему сценарию, а не подгонять чужой сценарий под свои задачи. То есть, если вы "программкой" начнёте завершать фаерфокс по имени процесса, то опять наступите на грабли, ибо, выше уже сказано. А если в процессах будет два фаерфокса или больше, тогда чего? Изучать поведение чужой "программки" и тратить на это нервы? Более того, завершать надо не по хендлу процесса, а по имени и хендлу окна, тогда фаер будет закрываться штатно, и не потребует галиматью при своём следующем открытии. Тут всего несколько строчек кодить, просто начальный уровень. |
mokujin > 16-01-2018 21:31:53 |
pv.exe посылает WM_CLOSE окну(-ам) сам находя его по имени процесса, так шо незвизди. Журавлёва пишетА если в процессах будет два фаерфокса или больше, тогда чего?
в скрипте поочереди через for или foreach с таймаутом и должно быть все норм. Журавлёва пишетТут всего несколько строчек кодить, просто начальный уровень.
тытышо!? ану-ка, ну-ка. я до сих пор так и не нашел нормального скрипта(VB, PS, cmd ) чтоб закрывать нормально(не убивать) программы в винде. Про проги в трее тем более, их даже эта программка не берет, окон то у них нету. |
Журавлёва > 16-01-2018 22:03:38 |
mokujin, какие скрипты? О чём вы.... Вы, что, ВинАпи скриптами применяете, что-ли? А насчёт WM_CLOSE вам выше написали, что не всегда это работает. Там другой мессадж нужен, но, я здесь не собираюсь вести уроки программирования, я могу только сказать, в какую сторону копать и где ошибка. То есть, чтобы отловить название окна и его хендл это нужно пару строчек кода, и ещё одна строчка, чтоб его закрыть. Имеется ввиду компилляция экзешника, а не примитивные скрипты, функционал которых ограничен. |
mokujin > 16-01-2018 22:32:56 |
Я про скрпиты, да. А ты про што, каким боком сюда "компилляция экзешника"... в тему про питон, js и cmd Журавлёва пишетА насчёт WM_CLOSE вам выше написали, что не всегда это работает.
В данном случае кокраз работает и отлично. Закрыватся бравзер точно так же как и по кнопке Выход. что и нужно. Ежли ты такой спец по С\++, давай накидай "пару строчек" в экзешнег , который бы принимал в параметрах(или списке или др. способом) имена процессов(или путя к програмам или... ) и закрывал бы их корректно. Никаких извратов, обычные виндовые окна такие как : totalcommander, firefox, chrome, mediaplayerClassic и др. . Всякие со скинами или др. сложные случаи не нужны. Это былоб отлично ибо за все время поисков ничего подобного до сих пор нету. теоретики булевы... |
Журавлёва > 16-01-2018 22:40:36 |
mokujin пишетВ данном случае кокраз работает и отлично. Закрыватся бравзер точно так же как и по кнопке Выход. что и нужно.
Если "работает отлично", пусть топикстартер напишет слово "РЕШЕНО" в заглавии топика. |
catapulta > 17-01-2018 07:29:21 |
Спасибо за ответы. Действительно, сейчас пишем программу на с++. Чтобы посмотреть какие окна открыты использую winspy. Для каждого окна есть имя и класс, для фф класс MozillaWindowClass, а имя - это имя активной вкладки и название браузера через дефис: "NamePage - Mozilla Firefox", либо "Mozilla Firefox", если вкладка пустая. Все замечательно, если я знаю имя вкладки, но как закрыть браузер перед запуском программы? Если оставить вторым параметром NULL, то работает только если вкладка одна и пустая Склоняемся к мнению, что закрывать первый раз тасккилом либо выдвигать требование закрыть браузер перед использованием. Но если есть какие тонкости в именовании окон, будем благодарны за совет или за ссылки. Также остается открытым вопрос: почему из питона винапи не вызывается? Хендл окна находит верно, но закрыть не может даже блокнот. Использовалась библиотека ctypes. Ну это надо на питон форумах вопрос задавать наверное. Если что-нибудь еще найду по теме, отпишусь в течении недели двух. 17-01-2018 07:41:36 mokujin пишетЕсли это поможет. Есть такая чудная программка, консольная как положено, которая умеет то что нужно: закрыть окна по имени процесса. Ей 100летвобед но она шикарна: просто делаем pv -c firefox.exe и окно нормально закроется. попробуй. описание PV.EXE саму прогу могу залить, если нужна и не найдешь(там 72kB всего).
Спасибо, рассмотрим |
catapulta > 17-01-2018 08:36:23 |
Ну да, в итоге эта программулька заработала из питона, firefox перестал ломаться. |
Журавлёва > 17-01-2018 09:46:56 |
catapulta пишетДействительно, сейчас пишем программу на с++. ...почему из питона винапи не вызывается? Хендл окна находит верно, но закрыть не может даже блокнот.
Питон не закрывает, потому что, это питон. Как сказал один футболист, "если бы у меня были точные пасы, я бы играл в Манчестер Юнайтед". Также и питон, если бы он что-то мог безупречно, то, все бы кодили на нём. Теперь к делу... Не надо закрывать фаер никакими сторонними тассккилами, а надо отлавливать окно, в названии которого есть буквы firefox, то есть, название может быть любой длины строки, но в строке искать буквы firefox. Такое окно делать активным поверх всех и посылать ему горячие клавиши АЛТ+Ф4. Тогда фаер закроется штатно, можете проверить сейчас вручную. После этого, ждать когда в процессах исчезнет плагин-контейнер, который имеет обыкновение там продолжать болтаться, всё это смотреть по месту, ибо, фаерфоксфы разные и невозможно сказать, чего там намутили на этот раз. |
catapulta > 17-01-2018 14:02:51 |
Перебрать окна средствами винапи - это, наверное, можно. А как сделать вкладку активной? в винспай я вижу только одно окно с активной вкладкой, как добраться до другой вкладки и сделать активной ее? Это нужно браузерское апи. А такого нет наверное Мне повторюсь нужно только программное решение, не ручное. Если речь идет о моей странице, то я знаю ее имя и я ее закрою, а если о вкладках уже открытых на начало программы, то в принципе программа запускает новое окно и мне это на руку, что предыдущее окно с сотней вкладок не закрылась. Я закрываю активную вкладку и с ней закрывается окно. Что там в процессах висит - ну и пусть висит. Будет проблема будем решать. 17-01-2018 14:21:29 А не я не так поняла. Я нашла свое окно с вкладкой и без проблем его закрыла без того, чтобы сделать активным. У меня проблема не потерять эту вкладку, поскольку только по ней я могу найти окно, а она теоретически может смениться, окно назовется по-другому и я его не найду. Ну вообще да можно просто перебрать все окна и не бояться потерять. |
Журавлёва > 17-01-2018 14:34:12 |
catapulta, при любом названии вкладки, при любом, в строке присутствует буквы Mozilla Firerfox. Перебирать окна GetWindowText на предмет наличия в строке названия букв Mozilla Firerfox и получать хендл окна. Делать окно это активным ShowWindow и закрывать как уже сказано. |
okkamas_knife > 17-01-2018 14:38:01 |
рекомендую любителям гамаков и лыж почитать справку тасккилла и немного применить мозгов. там можно искать и по названию окна и завершать не принудительно (т.е. послать процессу сигнал который он отработает и корректно закроется) вопрос про закрытие нескольких вкладок элементарно отключается в конфиге для закрытия фф вкладки переключения на вкладку скрипту нужны лишь права расширения если скрипт исполняется на страничке то можно сделать изменение какого либо элемента в конце а скрипт самого фф (тот что с достаточными правами просто отслеживает его) |
catapulta > 17-01-2018 14:46:40 |
Журавлёва пишетcatapulta, при любом названии вкладки, при любом, в строке присутствует буквы Mozilla Firerfox. Перебирать окна GetWindowText на предмет наличия в строке названия букв Mozilla Firerfox и получать хендл окна. Делать окно это активным ShowWindow и закрывать как уже сказано.
а зачем делать активным? он и так понимает по хендлу. "Mozilla Firerfox"присутствует также и в том окне, в котором куча нужных вкладок. Я могу закрыть это окно и не закрыть то, которое нужно закрыть. Поэтому нужно знать полное название активной вкладки и я его знаю, поскольку сама же ее и запустила. Если только пользователь не переключит. Ну если переключит то пусть сам закрывает раз такой умный |
catapulta > 18-01-2018 13:05:56 |
Дамы и господа, я дико извиняюсь, наклеветала. Питон прекрасно выполняет функцию закрытия окна. Протупили с параметрами. Надо было число отправлять, а не строку. |