Используя Win32GUI и Watsup, я пишу немного кода Python для автоматизации поиска через базу данных, к которой осуществляется доступ через программа, которая не имеет интерфейса для нее. Таким образом, я могу взять строку из списка, а затем ввести ее в поле поиска и нажать "искать".
Однако, когда поиск возвращает более 1000 результатов, программа выдает диалоговое окно с предупреждением - это просто уведомление о количестве результатов, которое останавливает выполнение кода Python. Я не могу заставить код продвигаться по строке, где он нажимает поиск.
Угадайте, это было бы потому, что он не ожидает окна или не знает, как обрабатывать предупреждение, - но я тоже этого не делаю, кроме его принятия вручную. Ниже приведен пример образца кода, хотя он, вероятно, не очень поучительный. После "clickButton (LookupButton)" выполнение останавливается.
LookupButtonlocation = elemstring.find("Lookup", AuthNameFieldlocation) - 15
#Use Regex search to find handles
number_regex = re.compile(';(\d+);')
AuthNameEdit = int(number_regex.search(elemstring[AuthNameFieldlocation:]).group(1))
LookupButton = int(number_regex.search(elemstring[LookupButtonlocation:]).group(1))
#Input new Author into Edit Field
setEditText(AuthNameEdit, "John Campbell")
#Click lookup button
clickButton(LookupButton)
Я не пользователь WATSUP, но я делаю что-то очень похожее с помощью pywinauto - в моем случае я запускаю несколько автоматических тестов, которые открывают различные сторонние программы, которые аналогичным образом вызывают неудобные диалоговые окна предупреждения, Немного сложно справиться с диалоговыми окнами, о которых вы не знаете, однако, если вы знаете, какие диалоги появляются, но не тогда, когда они появляются, вы можете начать поток, чтобы иметь дело с этими всплывающими окнами. Ниже приведен простой пример того, что я делаю, и использует pywinauto, но вы можете адаптировать подход для WATSUP:
import time
import threading
class ClearPopupThread(threading.Thread):
def __init__(self, window_name, button_name, quit_event):
threading.Thread.__init__(self)
self.quit_event = quit_event
self.window_name = window_name
self.button_name = button_name
def run(self):
from pywinauto import application, findwindows
while True:
try:
handles = findwindows.find_windows(title=self.window_name)
except findwindows.WindowNotFoundError:
pass #Just do nothing if the pop-up dialog was not found
else: #The window was found, so click the button
for hwnd in handles:
app = application.Application()
app.Connect(handle=hwnd)
popup = app[self.window_name]
button = getattr(popup, self.button_name)
button.Click()
if self.quit_event.is_set():
break
time.sleep(1) #should help reduce cpu load a little for this thread
По существу этот поток представляет собой просто бесконечный цикл, который ищет всплывающее окно по имени, и если он его найдет, он нажимает кнопку, чтобы закрыть окно. Если у вас много всплывающих окон, вы можете открыть один поток за всплывающее окно (ошибка, которая не слишком эффективна, хотя). Поскольку это бесконечный цикл, у меня есть поток, который хочет увидеть, установлено ли событие, чтобы я мог остановить поток из моей основной программы. Итак, в основной программе я делаю что-то вроде этого:
#Start the thread
quit_event = threading.Event()
mythread = ClearPopupThread('Window Popup Title', 'Yes button', quit_event)
# ...
# My program does it thing here
# ...
# When my program is done I need to end the thread
quit_event.set()
Это не обязательно единственный способ справиться с вашей проблемой, но это способ, который работал у меня. Извините, я не могу вам помочь с WATSUP (я всегда находил pywinauto немного проще в использовании), но я заметил на домашней странице WATSUP (http://www.tizmoi.net/watsup/intro.html), пример 2 делает что-то подобное без использования потоков, т.е. ищет именованное окно и нажимает на определенную кнопку в этом окне.