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

Вы бы ещё скрин инспектора выложили для самого этого окна “Создать Рейс”, что там для него вообще распознаётся.

А если попробовать

SchedulesPane.findElements(By.xpath("*[starts-with(@Name,’’)]")); // сори за комбинирование но надеюсь понятно )

ну и потом вытащить 2-й элемент

Скрины из инспектора:

До момента нажатия кнопки ‘Создать’ (когда окно ‘Создать рейс’ еще не появилось)

После появления окна “Создать рейс”

Попробуйте нажать на нужную кнопку в этом окне/фрейме без поиска самого окна, т.е. найти кнопку во всём приложении. Да и понятно что вы копировали “Создать рейс” с поля Name же?..

Видно, что окно “Создать Рейс” находится не в фокусе.
А Winium вообще умеет переключать фокус между окнами?
В списке поддерживаемых команд ничего не нашел: Supported Commands · 2gis/Winium.Desktop Wiki · GitHub

Да,копировал с поля Name, т.е. так и указываю ‘Создать Рейс’ как и отдает инспектор.
Пробовал нажать кнопку ‘RulesButton’ ,которая находится внутри окна ‘Создать Рейс’ тремя способами:

  1. Напрямую через драйвер
driver = webdriver.Remote(command_executor='http://localhost:9999',
						  desired_capabilities={'app':r'C:/LEO/leosd/program.exe'})

window = driver.find_element_by_class_name('Qt5QWindow')
print ("Программа запущена")
time.sleep(20)
MainWindow = driver.find_element_by_name('LeoMainWindow')
MainWindow.find_element_by_name('Создать').click()   #кнопка успешно нажалась и появилось окно с name 'Создать Рейс'
time.sleep(10)
driver.find_element_by_name('RulesButton').click()
  1. Напрямую через главное окно LeoMainWindow ,которое ищется повторно после появления окна ‘Создать Рейс’
driver = webdriver.Remote(command_executor='http://localhost:9999',
						  desired_capabilities={'app':r'C:/LEO/leosd/program.exe'})

window = driver.find_element_by_class_name('Qt5QWindow')
print ("Программа запущена")
time.sleep(20)
MainWindow = driver.find_element_by_name('LeoMainWindow')
MainWindow.find_element_by_name('Создать').click()   #кнопка успешно нажалась и появилось окно с name 'Создать Рейс'
time.sleep(10)
MainWindow2 = driver.find_element_by_name('LeoMainWindow')
MainWindow2.find_element_by_name('RulesButton').click()
  1. Напрямую через главное окно LeoMainWindow,которое не ищется повторно после появления окна ‘Создать Рейс’
driver = webdriver.Remote(command_executor='http://localhost:9999',
						  desired_capabilities={'app':r'C:/LEO/leosd/program.exe'})

window = driver.find_element_by_class_name('Qt5QWindow')
print ("Программа запущена")
time.sleep(20)
MainWindow = driver.find_element_by_name('LeoMainWindow')
MainWindow.find_element_by_name('Создать').click()   #кнопка успешно нажалась и появилось окно с name 'Создать Рейс'
time.sleep(10)
MainWindow.find_element_by_name('RulesButton').click()

Через find_elements_by_xpath("*[starts-with(@Name,’’)]") находит только 1 элемент

MainWindow2 = driver.find_element_by_name('LeoMainWindow')
MainWindow3 = MainWindow2.find_element_by_name('SchedulesPane')
aa = MainWindow3.find_elements_by_xpath("*[starts-with(@Name,'')]")

Mes тоже писал,что в исходниках ничего похожео не нашел(

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

У меня в одном месте есть такая команда
driver.switchTo().activeElement();
попробуйте её использовать после MainWindow.find_element_by_name(‘Создать’).click()

Не совсем понял,что нужно сделать.Когда открывается окно “Создать Рейс”,то курсор находится в поле,и если использовать switch_to.active_element, то можно ввести значение в это поле.Получатся что Виниум может обратится к элементу окна внутри программы.Вот как теперь найти родителя элемента,которой возвращает driver.switch_to.active_element, чтобы внутри него потом например искать другие элементы этого окна?

MainWindow = driver.find_element_by_name('LeoMainWindow')
MainWindow.find_element_by_name('Создать').click()   
time.sleep(10)
aa = driver.switch_to.active_element
aa.send_keys("1234")

1 лайк

Отвечаю на свой последний вопрос: чтобы получить родителя элемента,полученного от switch_to.active_element можно использовать find_element_by_xpath(‘parent::*’)
В моем примере нужно было проделать это 2 раза,чтобы добраться до ModifyWgtsHead, а потом в ModifyWgtsHead можно найти кнопку RulesButton и кликнуть по ней

MainWindow = driver.find_element_by_name('LeoMainWindow')
MainWindow.find_element_by_name('Создать').click()   #кнопка успешно нажалась и появилось окно с name 'Создать Рейс'
time.sleep(10)
aa = driver.switch_to.active_element
bb = aa.find_element_by_xpath('parent::*')
cc = bb.find_element_by_xpath('parent::*')
cc.find_element_by_name('RulesButton').click()

Конечно выглядит как костыль,но всё же достучаться до кнопки получилось

А если без driver.switch_to.active_element запустить:

MainWindow = driver.find_element_by_name('LeoMainWindow')
MainWindow.find_element_by_name('Создать').click()   
time.sleep(10)
#aa = driver.switch_to.active_element
MainWindow.send_keys("1234")

Заполнится поле “Рейс”?

Без driver.switch_to.active_element, поле “Рейс” не заполняется - идет ошибка:
selenium.common.exceptions.WebDriverException: Message: NOT CLICK