Я хотел бы автоматизировать загрузку файла на веб-сайт, используя QWebView PyQt4, но есть часть, которую я пока не могу понять. Для загрузки файла на веб-сайте есть кнопка, которая открывает диалоговое окно, из которого вы должны выбрать локальный файл. Итак, это мои вопросы 🙂 Есть ли способ управления этим диалогом, когда я нажимаю кнопку? Есть ли лучший способ добиться этого?
редактировать
Веб-сайт https://maps.google.com/ и я загружаю файл .kml через Мои места> Создать карту> Импорт.
Возможно, что вы ищете QWebPage :: chooseFile() (Я полагаю, это зависит также от того, как веб-сайт обрабатывает это). Переопределите это и посмотрите, достаточно ли это. Делайте что хотите и возвращайте выбранный путь к файлу.
РЕДАКТИРОВАТЬ: Теперь, когда вы предоставили ссылку, которую я протестировал и, кажется, работает.
Хорошо, для начала позвольте мне начать с справочной информации и ссылок.
Модуль, который я буду использовать, pywin32
скачать Вот, конкретно win32gui
, Ссылка на API Вот.
Теперь, прежде чем вы сможете манипулировать диалогом, вам нужно «перейти» к дескриптору окна, используйте следующие win32.FindWindow
Справочник по API Вот, который выглядит следующим образом, где два входа являются lpclassName
в этом случае #32770
(обозначает диалог) Вот и lpWindowName
который в этом случае File Upload
,
HWND WINAPI FindWindow(
_In_opt_ LPCTSTR lpClassName,
_In_opt_ LPCTSTR lpWindowName
);
Код для поиска дескриптора файла:
import win32gui
control = win32gui.FindWindow("#32770", "File Upload")
И он хранит ручку, которая в моем случае была 721470
,
Следующий шаг — найдите дескрипторы объектов GUI в диалоге, я покажу пример Cancel
кнопка. Чтобы найти ручку, я буду использовать FindWindowEx
Ссылка API здесь,
import win32con
import win32api
ButtonHandle = win32gui.FindWindowEx(control, 0, "Button", "Cancel");
win32api.SendMessage(ButtonHandle, win32con.BM_CLICK, 0, 0)
Ссылка Вот для BM_CLICK
а также Вот для SendMessage
,
Финальный код:
import win32gui
import win32api
import win32con
window = win32gui.GetForegroundWindow()
title = win32gui.GetWindowText(window)
control = win32gui.FindWindow("#32770", "File Upload")
ButtonHandle = win32gui.FindWindowEx(control, 0, "Button", "Cancel")
win32api.SendMessage(ButtonHandle, win32con.BM_CLICK, 0, 0)
Другой способ заключается в использовании watsup.winGuiAuto
модуль, Вот, пример ниже:
from watsup.winGuiAuto import *
optDialog = findTopWindow(wantedText="File Upload")
CancelButton = findControl(optDialog,wantedClass="Button", wantedText="Cancel")
clickButton(SaveButton)
Но я считаю, что самый простой способ — это использовать autoit
Вот, Я использовал это раньше в PyQT, чтобы стрелять команды.
Надеюсь это поможет!
Дополнительные ссылки (версии pywin32):
win32gui
Вот
win32api
Вот
Я думаю, что решение, данное @LucaCarlon, является правильным и заслуживает бонуса.
Вот протестированная чистая демонстрация PyQt4, которая более или менее воспроизводит реализацию по умолчанию:
import sys
from PyQt4 import QtCore, QtGui, QtWebKit
class WebPage(QtWebKit.QWebPage):
def chooseFile(self, frame=None, path=''):
return QtGui.QFileDialog.getOpenFileName(self.parent(), '', path)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
view = QtWebKit.QWebView()
view.setPage(WebPage(view))
view.load(QtCore.QUrl('https://maps.google.com/'))
view.show()
sys.exit(app.exec_())