Подключение к запущенному процессу в Winappdriver с помощью Javascript

Я новичок в JS / Winappdriver.

Приложение, которое я пытаюсь протестировать, представляет собой приложение «Click Once» для Windows из .Net, поэтому мне нужно перейти на веб-сайт из IE и нажать «Установить». Это откроет приложение.

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

Используя C #, я перебирал процессы, ища имя процесса, получал дескриптор окна, преобразовывал его в шестнадцатеричный, добавлял это как возможность и создавал драйвер - это сработало. Пример кода ниже,

public Setup_TearDown()
        {
            string TopLevelWindowHandleHex = null;
            IntPtr TopLevelWindowHandle = new IntPtr();
            foreach (Process clsProcess in Process.GetProcesses())
            {
                if (clsProcess.ProcessName.StartsWith($"SomeName-{exec_pob}-{exec_env}"))
                {
                    TopLevelWindowHandle = clsProcess.Handle;
                    TopLevelWindowHandleHex = clsProcess.MainWindowHandle.ToString("x");
                }
            }
            var appOptions = new AppiumOptions();
            appOptions.AddAdditionalCapability("appTopLevelWindow", TopLevelWindowHandleHex);
            appOptions.AddAdditionalCapability("ms:experimental-webdriver", true);
            appOptions.AddAdditionalCapability("ms:waitForAppLaunch", "25");
            AppDriver = new WindowsDriver<WindowsElement>(new Uri(WinAppDriverUrl), appOptions);
            AppDriver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(60);
        }

Как мне сделать это в Javascript? Кажется, я не могу найти никаких примеров кода. Основываясь на примере из этого репозитория, я попробовал следующее в JS, чтобы найти процесс, за который нужно закрепиться, но безуспешно.

import {By2} from "selenium-appium";
// this.appWindow = this.driver.element(By2.nativeAccessibilityId('xxx'));
        // this.appWindow = this.driver.element(By2.nativeXpath("//Window[starts-with(@Name,\"xxxx\")]"));
        // this.appWindow = this.driver.elementByName('WindowsForms10.Window.8.app.0.13965fa_r11_ad1');
        // thisappWindow = this.driver.elementByName('xxxxxxx');

async connectAppDriver(){
        await this.waitForAppWindow();
        var appWindow = await this.appWindow.getAttribute("NativeWindowHandle");
        let hex = (Number(ewarpWindow)).toString(16);
        var currentAppCapabilities =
            {
                "appTopLevelWindow": hex,
                "platformName": "Windows",
                "deviceName": "WindowsPC",
                "newCommandTimeout": "120000"
            }
        let driverBuilder = new DriverBuilder();
        await driverBuilder.stopDriver();
        this.driver = await driverBuilder.createDriver(currentEwarpCapabilities);
        return this.driver;
    }

Я постоянно получаю эту ошибку в Winappdriver

{"status":13,"value":{"error":"unknown error","message":"An unknown error occurred in the remote end while processing the command."}}

Я также открыл этот билет здесь.

Это кажется таким простым делом, но я не мог понять этого.

Любой из пакетов узлов, который я мог бы использовать, чтобы легко получить дескриптор окна верхнего уровня?

Я открыт для предложений о том, как решить эту проблему при использовании JavaScript для Winappdriver.


person Venkat Rao    schedule 18.03.2020    source источник


Ответы (1)


Надеюсь, это поможет кому-то там,

Обошли это, создав exe с использованием C #, который сгенерировал шестнадцатеричный код приложения для подключения на основе имени процесса, это выглядит примерно так.

 public string GetTopLevelWindowHandleHex()
    {
        string TopLevelWindowHandleHex = null;
        IntPtr TopLevelWindowHandle = new IntPtr();
        foreach (Process clsProcess in Process.GetProcesses())
        {
            if (clsProcess.ProcessName.StartsWith(_processName))
            {
                TopLevelWindowHandle = clsProcess.Handle;
                TopLevelWindowHandleHex = clsProcess.MainWindowHandle.ToString("x");
            }
        }
        if (!String.IsNullOrEmpty(TopLevelWindowHandleHex))
            return TopLevelWindowHandleHex;
        else
            throw new Exception($"Process: {_processName} cannot be found");
    }

Вызывается из JS, чтобы получить шестнадцатеричный дескриптор окна верхнего уровня, вот так:

async getHex () {
    var pathToExe =await path.join(process.cwd(), "features\\support\\ProcessUtility\\GetWindowHandleHexByProcessName.exe");
    var pathToDir =await path.join(process.cwd(), "features\\support\\ProcessUtility");
    const result = await execFileSync(pathToExe, [this.processName]
            , {cwd: pathToDir, encoding: 'utf-8'}
            , async function (err, data) {
                console.log("Error: "+ err);
                console.log("Data(hex): "+ data);
                return JSON.stringify(data.toString());
            });
    return result.toString().trim();
}

Использовал шестнадцатеричный код для подключения к приложению вот так,

async connectAppDriver(hex) {
    console.log(`Hex received to connect to app using hex: ${hex}`);
    const currentAppCapabilities=
        {
            "browserName": '',
            "appTopLevelWindow": hex.trim(),
            "platformName": "Windows",
            "deviceName": "WindowsPC",
            "newCommandTimeout": "120000"
        };
    const appDriver = await new Builder()
        .usingServer("http://localhost:4723/wd/hub")
        .withCapabilities(currentAppCapabilities)
        .build();
    await driver.startWithWebDriver(appDriver);
    return driver;
}
person Venkat Rao    schedule 09.06.2020