t.me/atinfo_chat Telegram группа по автоматизации тестирования

Winium.Desktop не может найти окно,которое возникает внутри программы

Теги: #<Tag:0x00007f7488db55c0> #<Tag:0x00007f7488db5458> #<Tag:0x00007f7488db5318> #<Tag:0x00007f7488db5250>

Добрый день.Пытаемся написать автотесты для desktop приложения (само приложение написано на Qt5 и C++)
В качестве инструмента выбрали #winium .
Проблема заключается,в том что в тестируемом приложении появляются окна (с кнопками и др. элементами)
У окон и кнопок есть свои Name, но #winium почему-то не находит их как элементы.

Пример кода на #python

# Находим главное окно приложения и нажимаем кнопку 'Создать' в этом окне
MainWindow = driver.find_element_by_name('LeoMainWindow')
MainWindow.find_element_by_name('Создать').click()   #кнопка успешно нажалась и появилось окно с name 'Создать Рейс'

#пытаемся переключится в это окно
MainWindow2 = driver.find_element_by_name('LeoMainWindow')
WindowCreateFlight = MainWindow2.find_element_by_name('Создать Рейс') # возникает ошибка,что элемент не найден

Прикладываю скрины из Inspect

и тестируемой программы

а если искать от driver случайно не работает?

Нет.Изначально так и пытался…Потом уже стал искать от нового драйвера,но безрезультатно… Может в Виниуме нужно как-то по особому переключаться в окна (типа как с frame,когда тестируем веб) ?

Трейс ошибки можно посмотреть?

Traceback (most recent call last):
  File "C:/PyCharm/calc/test.py", line 26, in <module>
    WindowCreateFlight = MainWindow2.find_element_by_name('Создать Рейс') # возникает ошибка,что элемент не найден
  File "C:\Python34\lib\site-packages\selenium\webdriver\remote\webelement.py", line 154, in find_element_by_name
    return self.find_element(by=By.NAME, value=name)
  File "C:\Python34\lib\site-packages\selenium\webdriver\remote\webelement.py", line 478, in find_element
    {"using": by, "value": value})['value']
  File "C:\Python34\lib\site-packages\selenium\webdriver\remote\webelement.py", line 461, in _execute
    return self._parent.execute(command, params)
  File "C:\Python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 236, in execute
    self.error_handler.check_response(response)
  File "C:\Python34\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 192, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: Element cannot be found

Если информация будет полезна,то проблемное окно наследуется от QMdiSubWindow

У этого элемента кроме имени есть другие идентификаторы? Попробовать поискать по id если?

Нет,только имя

Попробуйте поставить sleep. Потом поискать элемент.

Пробовал ещё вчера,по 10 секунд выставлял- не помогает(

Почитай про Frame должно помочь!

В том то и вопрос(мой первый комментарий) поддерживает ли Wimum это или нет,или есть какой-то другой способ?

Если использовать как:
ff = driver.switch_to.frame('Создать Рейс')
То идет ошибка:
selenium.common.exceptions.WebDriverException: Message: 'switchToFrame' is not valid or implemented command.

а если попробовать найти child “Создать рейс”? Например MainWidget

Чет в исходниках виниума ничего похожего на switchTo frame не увидел.

Yurij_Litvin: “а если попробовать найти child “Создать рейс”? Например MainWidget”

  • не находит.
    Также дополнительно пробовал искать в SchedulesPane (SchedulesPane находится успешно), но ни ‘Создать Рейс’ ни его дочерний элемент MainWidget’ не находятся
MainWindow = driver.find_element_by_name('LeoMainWindow')
MainWindow.find_element_by_name('Создать').click()   #кнопка успешно нажалась и появилось окно с name 'Создать Рейс'
time.sleep(10)
MainWindow2 = driver.find_element_by_name('LeoMainWindow')
SchedulesPane = MainWindow2.find_element_by_name('SchedulesPane')
CreateFlight = SchedulesPane.find_element_by_name('Создать Рейс')

и

MainWindow = driver.find_element_by_name('LeoMainWindow')
MainWindow.find_element_by_name('Создать').click()   #кнопка успешно нажалась и появилось окно с name 'Создать Рейс'
time.sleep(10)
MainWindow2 = driver.find_element_by_name('LeoMainWindow')
SchedulesPane = MainWindow2.find_element_by_name('SchedulesPane')
CreateFlight = SchedulesPane.find_element_by_name('MainWidget')

Тут может быть проблема из-за пробела в “Создать Рейс”.
Если есть доступ к исходному коду, попробуйте переименовать название окна - “СоздатьРейс”.
Если после этого заработает, значит нужно разбираться с кодировкой.

У меня с пробелами норм работает… Но вот окна как child другого окна нигде нет…

Окна,где нет пробелов -тоже не находятся…

Еще попробовал искать через driver.switch_to.window(handle) , где handle - ищутся командами: driver.current_window_handle - активный или driver.window_handles - все . Но тут возникло 2 сложности:1) Командой driver.window_handles - Winium находит все handles программ открытых на компьютере (это не так страшно,т.к. можно избавиться потом от лишних методом исключения) .Но вот это уже не позволяет использовать driver.switch_to.window(handle) - 2) Независимо от того,сколько вкладок и окон открыто внутри тестируемой программы,именно для неё driver.window_handles будет всегда находить только 1 handle

Может там символы в разной кодировке? Проверить буквы “с”, “о”. :slight_smile:
В порядке бреда, конечно.

На всякий случай проверил и кодировку- с ней всё в порядке)

1 Симпатия