Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

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

qt
winium
locators
python
Теги: #<Tag:0x00007f7b70520538> #<Tag:0x00007f7b705203f8> #<Tag:0x00007f7b70520290> #<Tag:0x00007f7b70520088>

(Юрий Усов) #1

Добрый день.Пытаемся написать автотесты для 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

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


(Yurij Litvin) #2

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


(Юрий Усов) #3

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


(Bolatbek) #4

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


(Юрий Усов) #5
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

(Юрий Усов) #6

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


(Bolatbek) #7

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


(Юрий Усов) #8

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


(Bolatbek) #9

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


(Юрий Усов) #10

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


(Ярослав Бойко) #11

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


(Юрий Усов) #12

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

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


(Yurij Litvin) #13

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


(Bolatbek) #14

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


(Юрий Усов) #15

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')

(Yury) #16

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


(Yurij Litvin) #17

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


(Юрий Усов) #18

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

Еще попробовал искать через 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


(Bolatbek) #19

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


(Юрий Усов) #20

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