Как выбрать пункт меню в меню приложения, используя Appium и Python в Windows? - PullRequest
0 голосов
/ 09 мая 2019

Я работаю над автоматизацией UI-тестов для приложения и имею проблемы с пунктами меню в Windows. Кстати, у меня это работает на Mac для сестринского приложения. Я использую Appium из Python.

Я могу найти дерево меню с помощью Inspect.exe, щелкнуть меню верхнего уровня, которое затем открывает раскрывающийся список, и здесь я нахожу пункт меню, который хочу щелкнуть, но WinAppDriver не удается с этой ошибкой: {"status":105,"value":{"error":"element not interactable","message":"An element command could not be completed because the element is not pointer- or keyboard interactable."}}

Следующий питон воспроизводит проблему.

import time
import unittest
from appium import webdriver

app_exe_path = "C:\\Program Files\\Phase One\\Capture One 12\\CaptureOne.exe"
menu_name = "Select"
menu_item_name = "First"
switch_window = True
# app_exe_path = "C:\\Windows\\Notepad.exe"
# menu_name = "File"
# menu_item_name = "Open..."
# switch_window = False


class ClickApplicationMenuItem(unittest.TestCase):
    def test_click_application_menu_item(self):
        driver = webdriver.Remote(
            command_executor="http://localhost:4723",
            desired_capabilities={"app": app_exe_path},
        )
        if switch_window:
            time.sleep(5) # non-optimal code for the sake of a simple repro
            handles = driver.window_handles
            driver.switch_to.window(handles[0])
        menu = driver.find_element_by_name(menu_name)
        menu.click() # fails in the Notepad case
        item = menu.find_element_by_name(menu_item_name)
        item.click() # fails in the CaptureOne case


if __name__ == "__main__":
    unittest.main()

Любой совет, как щелкнуть пункт меню?

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Вот что в итоге заработало для пункта меню (я сохраняю menu.click(), так как это работает для приложения, я тестирую):

   from selenium.webdriver.common.action_chains import ActionChains
   actions = ActionChains(driver)
   actions.click(item)
   actions.perform()
0 голосов
/ 10 мая 2019

Поскольку вы можете найти эти элементы, я предполагаю, что у вас есть доступ к их свойствам. Простой обходной путь может заключаться в щелчке по координатам элементов вместо щелчка по самому элементу. Обычно щелкать координаты - плохая идея, но, поскольку вы получаете координаты самого элемента, здесь я не вижу проблем.

Попробуйте что-то вроде этого:

menu = driver.find_element_by_name(menu_name)
driver.Mouse.Click(menu.coordinates)
item = menu.find_element_by_name(menu_item_name)
driver.Mouse.Click(item.coordinates)

Я получил предупреждение, что функциональность мыши устарела и что следует использовать класс Actions или ActionBuilder. Вы также можете изучить эти варианты, но я обнаружил проблему, которая была закрыта в марте 2018 года на странице github winappdriver, касательно этого класса Actions. Непонятно, почему это закрыто. Вы можете найти альтернативный способ щелкнуть там координаты.

Ресурсы: Actions выпуск

...