Robotframework, AutoIt: сообщение об ошибке «Не найдено ни одного ключевого слова с именем« Отправить »» - PullRequest
1 голос
/ 23 февраля 2020

Я пытаюсь ознакомиться с рамками робота, используя autoitlibrary для тестирования Windows приложений. Я нашел несколько примеров использования команды Send для ввода текста в окне notpad.

Это то, что я сделал до сих пор:

*** Settings ***
Library           AutoItLibrary

*** Variables ***
${app}            C:/Program Files/Notepad++/notepad++.exe

*** Test Cases ***
Enter text
    Run    ${app}
    Win Wait Active    new 1 - Notepad++
    Send    This is just a test.

Итак, окно Notepad ++ открыто , но затем произошел сбой с сообщением No keyword with name 'Send' found.. Я предполагаю, что в AutoItLibrary нет команды Send, но я также не могу найти любую другую команду, которая может выполнить эту работу.

AutoIt установлен, как и оболочка pip install robotframework-autoitlibrary.

В AutoIt действительно существует ключевое слово Send, но предположительно не в оболочке для роботизированной системы.

И есть идеи, как это исправить?

ОБНОВЛЕНИЕ: Windows 10 (64 бита в VirtualBox), Python v3.7.6 (32 бита), RF v3.1.2, RF-AutoItLibrary v1.2.4, AutoIt v3.3.14.5

Диалог «Ключевые слова для поиска» в RIDE предоставляет AutoItLibrary в качестве источника, но затем перечисляет только несколько команд. Так что я полагаю, что библиотека доступна, но неполна. enter image description here

Ответы [ 2 ]

2 голосов
/ 28 февраля 2020
import os, re, subprocess, sys

# Set path to Python directories.
programfiles = os.environ['programfiles']
if not programfiles:
    exit('Failed to get programfiles')

python_dirs = [os.path.join(programfiles, 'Python35'),
               os.path.join(programfiles, 'Python36'),
               os.path.join(programfiles, 'Python37'),
               os.path.join(programfiles, 'Python38')]

# Process each python directory.
for python_dir in python_dirs:
    print('---')

    # Set path to AutoItX3.dll.
    autoitx_dll = os.path.join(python_dir, r'Lib\site-packages\AutoItLibrary\lib\AutoItX3.dll')
    if not os.path.isfile(autoitx_dll):
        print('File not found: "' + autoitx_dll + '"')
        continue

    # Set path to the makepy module.
    makepy = os.path.join(python_dir, r'Lib\site-packages\win32com\client\makepy.py')
    if not os.path.isfile(makepy):
        print('File not found: "' + makepy + '"')
        continue

    # Generate cache using make.py.
    command = [os.path.join(python_dir, 'python.exe'), makepy, autoitx_dll]

    with subprocess.Popen(command, stderr=subprocess.PIPE, cwd=python_dir, universal_newlines=True) as p:
        stderr = p.communicate()[1]
        print(stderr.rstrip())

        parameters = re.findall(r'^Generating to .+\\([A-F0-9\-]+)x(\d+)x(\d+)x(\d+)\.py$', stderr, re.M)

        if len(parameters) == 1:
            parameters = parameters[0]

            print('Insert the next line into AutoItLibrary.__init__.py if not exist.\n'
                  '  win32com.client.gencache.EnsureModule("{{{guid}}}", {major}, {minor}, {lcid})'
                  .format(guid=parameters[0],
                          major=parameters[1],
                          minor=parameters[2],
                          lcid=parameters[3]))

# Pause so the user can view the subprocess output.
input('Press the return key to continue...')

Сгенерированный кеш win32com\client\makepy.py для AutoItLibrary из setup.py сохраняется в папке %temp%\gen_py. Это делается только при выполнении setup.py. Если каталог %temp% будет очищен позже, что приведет к удалению кэша, то я замечу, что ключевые слова, такие как Send, могут не распознаваться роботизированной рамой.

По-видимому, одним из решений является восстановление кеша. Приведенный выше код сгенерирует кэш с помощью makepy.py. Он также может распечатать сообщение о вставке win32com.client.gencache.EnsureModule(...) в AutoItLibrary\__init__.py для любой из Python версий по мере необходимости. Это обеспечит доступность кэша при импорте AutoItLibrary.

Изменение путей в коде в соответствии с вашей средой.


С дальнейшими исследованиями:

  • AutoItLibrary в настоящее время имеет AutoItX 3.3.6.1 и последний AutoIt имеет AutoItX 3.3.14.5. Важно знать, что одна зарегистрированная версия может перезаписать регистрацию предыдущей регистрации.
  • В настоящее время AutoItLibrary регистрирует AutoIt3X.dll без суффикса _x64 в имени в системах x64. Я могу сослаться на AutoIt3_x64.dll, чтобы определить разницу между x86 и x64.
  • Любая версия AutoIt3X.dll и AutoIt3_x64.dll использует те же коды идентификаторов и последние зарегистрированные выигрыши (основанные на битности как при регистрации x86, так и x64. может сосуществовать).
    Зарегистрированный идентификатор ключа класса TypeLib равен {F8937E53-D444-4E71-9275-35B64210CC3B} и где win32com может выполнять поиск.
  • Если AutoIt3X.dll и AutoIt3_x64.dll зарегистрированы, отмените регистрацию любого 1 из этих 2 удалит ключ класса AutoItX3.Control. Без этого ключа AutoIt3X не будет работать, так как AutoItLibrary нуждается в этом ключе. Чтобы исправить это, зарегистрируйтесь, например, regsvr32.exe AutoIt3X.dll как администратор в рабочем каталоге AutoIt3X.dll.
  • Методы любой той же версии AutoItX будут совпадать, т.е. AutoIt3X.dll и AutoIt3X_x64.dll только изменения в битности, но не методы.

Вставка win32com.client.gencache.EnsureModule("{F8937E53-D444-4E71-9275-35B64210CC3B}", 0, 1, 0) в AutoItLibrary\__init__.py должна обеспечить постоянную доступность кэша для любой версии AutoItX. Исходный код можно использовать для генерации кэша, хотя предлагаемое изменение в AutoItLibrary\__init__.py делает его устаревшим, поскольку кэш генерируется при импорте AutoItLibrary. Если идентификатор не был постоянным, то исходный код может информировать вас об используемом идентификаторе.

Кэш важен, поскольку он генерирует файлы .py с помощью таких методов, как, например:

       def Send(self, strSendText=defaultNamedNotOptArg, nMode=0):
           'method Send'
           # etc...

, который, если отсутствует, делает Send и многие другие недопустимым ключевым словом в AutoItLibrary.

Если зарегистрирован AutoItX 3.3.14.5, ведущие методы - удаляются, а * Добавлены 1057 * ведущих методов по сравнению с AutoItX 3.3.6.1:

-BlockInput
-CDTray
-IniDelete
-IniRead
-IniWrite
-RegDeleteKey
-RegDeleteVal
-RegEnumKey
-RegEnumVal
-RegRead
-RegWrite
-RunAsSet
+RunAs
+RunAsWait

Так что, если любой из этих методов вызывает ошибку, вы можете вместо этого зарегистрировать AutoItX 3.3.6.1. В истории AutoItX версия 3.3.10.0 - это время, когда произошли эти изменения метода.

0 голосов
/ 09 марта 2020

Исправление:

Проверьте архитектуру python (32 или 64-разрядная)

Для 32:

  1. Открыть cmd в режиме « Запуск от имени администратора »
  2. выполнить команду pip install robotframework-autoitlibrary
  3. Теперь клонировать источник библиотеки autoit код: https://github.com/nokia/robotframework-autoitlibrary
  4. в каталоге root выполните следующую команду: python setup.py install, используя cmd в режиме администратора

для навигации в каталог root используйте команду pushd <filepath>' instead of cd `, если cd не работает в cmd, открытом в режиме администратора.

Для 64:

  1. Открыть cmd в режиме " Запуск от имени администратора "
  2. Теперь клонируйте исходный код библиотеки autoit: https://github.com/nokia/robotframework-autoitlibrary
  3. в * В каталоге 1060 * выполните следующую команду: python setup.py install, используя cmd в режиме администратора

, чтобы перейти в каталог root, используйте команду pushd <filepath>' instead of cd `, если cd не работает в cmd открыт в режиме администратора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...