Автоматизация uTorrent с помощью pywinauto

Я пытаюсь автоматизировать utorrent, используя pywinauto lib. Я хочу добавить торрент с URL. Эта опция находится в меню файлов. Я могу открыть uTorrent, и ничего не происходит. Я использовал Swapy для генерации этого кода. Окно ниже открывается только тогда, когда я запускаю код в swapy. Но когда я сохраняю его в файл и запускаю с помощью cmd, открывается только utorrent, а в cmd происходит трассировка.

Поле, в которое я хочу ввести URL-адрес и нажать

from pywinauto.application import Application

app = Application().Start(cmd_line=u'"C:\\Users\\User\\AppData\\Roaming\\uTorrent\\u Torrent.exe" ')
torrentdfb = app[u'\xb5Torrent4823DF041B09']
torrentdfb.Wait('ready')
menu_item = torrentdfb.MenuItem(u'&File->Add Torrent from &URL...\tCtrl+U')
menu_item.Click()

app.Kill_()

Traceback:
Traceback (most recent call last):
File "AddTorrent.py", line 5, in <module>
torrentdfb.Wait('ready')
File "C:\Python27\lib\site-packages\pywinauto\application.py", line 380, in Wait
WaitUntil(timeout, retry_interval, lambda: self.__check_all_conditions(check_method_names))
File "C:\Python27\lib\site-packages\pywinauto\timings.py", line 308, in WaitUntil
raise err
pywinauto.timings.TimeoutError: timed out

Я новичок в программировании на Python и не являюсь экспертом. Было бы полезно, если бы вы предоставили объяснение для решения моей проблемы или кода. Спасибо!!


person Yashas    schedule 26.05.2016    source источник


Ответы (1)


uTorrent порождает другой процесс, вот как я это понял:

>>> app.windows_()
[]
>>> app.process
6096
>>> app.connect(title_re=u'^μTorrent.*(build \d+).*')
<pywinauto.application.Application object at 0x000000000405C240>
>>> app.process
4044L

Это окончательный код, работающий для меня (с 32-битным uTorrent и 32-битным Python 2.7):

import pywinauto

app = pywinauto.Application().start(r'uTorrent.exe')
time.sleep(5) # because method connect() has no timeout param yet (planned for 0.6.0)
app.connect(title_re=u'^\u03bcTorrent.*(build \d+).*')

main_window = app.window_(title_re=u'^\u03bcTorrent.*(build \d+).*')
main_window.MenuSelect(u'&File->Add Torrent from &URL...\tCtrl+U')

app.AddTorrentFromURL.Edit.SetText('some URL')
app.AddTorrentFromURL.OK.Click()

Битность важна. 32-битный uTorrent падает, если я использую 64-битный Python.

person Vasily Ryabov    schedule 26.05.2016
comment
Я не знаю, что случилось, но даже мой предыдущий код не работает. Теперь, когда я запускаю код, открывается только utorrent и ничего не происходит. Когда я проверяю терминал, появляется трассировка. Трассировка, похоже, связана с тайм-аутом. Даже когда я устанавливаю тайм-аут на 10 или 15, возникает та же ошибка. Буду признателен, если вы дадите мне полный код. Я посмотрю на это и узнаю, что пошло не так. - person Yashas; 26.05.2016
comment
Очевидно, что menu_item.edit1.TypeKeys("url to enter") неверно. Извините, у меня нет времени писать для вас весь сценарий. И я не могу объяснить, что происходит, без трассировки. Просто отредактируйте свой вопрос, если хотите добавить больше деталей. - person Vasily Ryabov; 27.05.2016
comment
Я отредактировал его. Я добавил трассировку и поместил точный код, сгенерированный swapy, для нажатия на URL-адрес «Добавить торрент». Когда код запускается в cmd, открывается utorrent и трассировка задается в cmd. Больше ничего не происходит. - person Yashas; 27.05.2016
comment
ХОРОШО. Пожалуйста, проверьте, что app.windows_() возвращает, когда окно открыто. Некоторые приложения порождают еще один процесс, поэтому, вероятно, в этом случае поможет app.connect(title=u'\xb5Torrent4823DF041B09'). - person Vasily Ryabov; 27.05.2016
comment
[‹объект pywinauto.controls.win32_controls.DialogWrapper по адресу 0x027DB770›, объект ‹pywinauto.controls.win32_controls.DialogWrapper по адресу 0x027DB750›] - person Yashas; 27.05.2016
comment
Хорошо, а как насчет print [win.WindowText() for win in app.windows_()]? И какой из них, как ожидается, будет иметь меню? - person Vasily Ryabov; 27.05.2016
comment
[окно u'GDI+', 'IME по умолчанию']. Та же самая трассировка все еще происходит. Я не знаю, у кого есть меню. - person Yashas; 27.05.2016
comment
Хорошо, я нашел время, чтобы автоматизировать это на моей стороне. Последнее предположение было верным. Он порождает еще один процесс, поэтому нам нужно повторно подключить объект app по заголовку (например). Смотрите обновленный ответ с кодом. - person Vasily Ryabov; 27.05.2016
comment
Битность важна. 32-битный uTorrent падает, если я использую 64-битный Python. - person Vasily Ryabov; 27.05.2016
comment
Наконец-то это работает!! Спасибо, что потратили столько времени.. Цените это!! Мир!! - person Yashas; 27.05.2016