Проблема с загрузкой файла с Python - PullRequest
3 голосов
/ 25 мая 2009

Я пытаюсь автоматически загрузить файл, нажав на ссылку на веб-странице. После нажатия на ссылку я получаю диалоговое окно «Загрузка файла» с кнопками «Открыть», «Сохранить» и «Отмена». Я хочу нажать кнопку Сохранить.

Я использую библиотеку watsup следующим образом:

from watsup.winGuiAuto import *

optDialog = findTopWindow(wantedText="File Download")

SaveButton = findControl(optDialog,wantedClass="Button", wantedText="Save")

clickButton(SaveButton)

Почему-то не работает. Интересно то, что точно так же Код отлично работает, нажимая на кнопку «Отмена», однако он отказывается работать с «Сохранить» или «Открыть».

Кто-нибудь знает, что мне делать?

Большое спасибо, Саша

Ответы [ 4 ]

1 голос
/ 26 мая 2009

Саша

Весьма вероятно, что диалоговое окно файла, на которое вы ссылаетесь ( диалог загрузки файла с предупреждением безопасности ), НЕ будет отвечать на сообщения Windows таким образом, из соображений безопасности. Диалог специально предназначен для ответа только пользователю, физически нажимающему на кнопку ОК с помощью мыши. Я думаю, вы обнаружите, что кнопка Run тоже не будет работать таким образом.

0 голосов
/ 25 мая 2009

Возможно, кнопка сохранения не всегда включена. Хотя может показаться, что это так, программа может увидеть исходное состояние, которое вы пропустили. Проверьте его состояние и дождитесь его включения.

[РЕДАКТИРОВАТЬ] Но возможно, что Роберт прав, и диалог просто проигнорирует вас по соображениям безопасности. В этом случае я предлагаю использовать BeautifulSoup для анализа HTML, извлечения URL-адреса и загрузки файла в Python с помощью модуля urllib2 .

0 голосов
/ 25 мая 2009

Саша

Код эта ссылка должна работать. Он использует ctypes вместо watsup.winGuiAuto и использует вызовы win32. Вот код:

from ctypes import *
user32 = windll.user32

EnumWindowsProc = WINFUNCTYPE(c_int, c_int, c_int)

def GetHandles(title, parent=None):
'Returns handles to windows with matching titles'
hwnds = []
def EnumCB(hwnd, lparam, match=title.lower(), hwnds=hwnds):
title = c_buffer(' ' * 256)
user32.GetWindowTextA(hwnd, title, 255)
if title.value.lower() == match:
hwnds.append(hwnd)

if parent is not None:
user32.EnumChildWindows(parent, EnumWindowsProc(EnumCB), 0)
else:
user32.EnumWindows(EnumWindowsProc(EnumCB), 0)
return hwnds

Вот пример вызова, чтобы нажать кнопку Ok в любом окне, которое имеет заголовок «Свойства загрузки» (скорее всего, 0 или 1 таких окон):

for handle in GetHandles('Downloads properties'):
for childHandle in GetHandles('ok', handle):
user32.SendMessageA(childHandle, 0x00F5, 0, 0) # 0x00F5 = BM_CLICK
0 голосов
/ 25 мая 2009

Попробуйте это:

from watsup.winGuiAuto import *
optDialog = findTopWindow(wantedText="File Download")
SaveButton = findControl(optDialog, wantedClass="Button", wantedText="Submit")
clickButton(SaveButton) 
...