Вы бы ещё скрин инспектора выложили для самого этого окна “Создать Рейс”, что там для него вообще распознаётся.
А если попробовать
SchedulesPane.findElements(By.xpath("*[starts-with(@Name,’’)]")); // сори за комбинирование но надеюсь понятно )
ну и потом вытащить 2-й элемент
Скрины из инспектора:
До момента нажатия кнопки ‘Создать’ (когда окно ‘Создать рейс’ еще не появилось)
После появления окна “Создать рейс”
Попробуйте нажать на нужную кнопку в этом окне/фрейме без поиска самого окна, т.е. найти кнопку во всём приложении. Да и понятно что вы копировали “Создать рейс” с поля Name же?..
Видно, что окно “Создать Рейс” находится не в фокусе.
А Winium вообще умеет переключать фокус между окнами?
В списке поддерживаемых команд ничего не нашел: Supported Commands · 2gis/Winium.Desktop Wiki · GitHub
Да,копировал с поля Name, т.е. так и указываю ‘Создать Рейс’ как и отдает инспектор.
Пробовал нажать кнопку ‘RulesButton’ ,которая находится внутри окна ‘Создать Рейс’ тремя способами:
- Напрямую через драйвер
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()
- Напрямую через главное окно 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()
- Напрямую через главное окно 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")
Отвечаю на свой последний вопрос: чтобы получить родителя элемента,полученного от 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