Spectron — TypeError: app.client.getText не является функцией

#javascript #jestjs #electron #electron-forge #spectron

#javascript #jestjs #электрон #электронная кузница #spectron

Вопрос:

Я хочу создавать тесты в своем репозитории (https://github.com/DWboutin/jest-spectron-ts ) кажется, все работает, но я не могу получить доступ к API Application.client в своих тестах.

Я пробовал в стиле Promises, async / await, с Mocha, и я не могу заставить его работать.

Это мой единственный тестовый файл (очень простой)

 
const path = require("path");
const Application = require("spectron").Application;
const electron = require("electron");

jest.setTimeout(10000); // increase to 50000 on low spec laptop

let app: any = new Application({
  path: electron,
  args: [path.join(__dirname, "..", ".webpack", "main", "index.js")]
});

describe("test", () => {
  beforeAll(async () => {
    await app.start();
  });

  afterAll(async () => {
    if (app amp;amp; app.isRunning()) {
      await app.stop();
    }
  });

  it("shows an initial window", async () => {
    const windowCount = await app.client.getWindowCount();

    expect(windowCount).toBe(1); // this gives 2, I don't know why
  });

  it("should have correct text", async () => {
    const h1Text = await app.client.getText("h1"); // TypeError: app.client.getText is not a function

    expect(h1Text).toEqual("Hello World!");
  });
});
 

Может кто-нибудь мне помочь, пожалуйста?

Ответ №1:

Что касается вашего комментария о windowCount бытии 2 , см. Последний комментарий в этом разделе документации.

// Пожалуйста, обратите внимание, что getWindowCount() вернет 2, если dev tools они открыты.

Я не знаю, открыты ли devtools или нет, но, похоже, на данный момент это официальное обоснование.

Что касается app.client.getText того, что это не функция, это потому, что это не функция. На самом деле кажется, что документация неверна — возможно, не обновлена с версии 11.0.0 до версии 11.1.0 и забыта.

Spectron использует WebdriverIO и предоставляет управляемое client свойство для созданных экземпляров приложения. Клиентский API является browser объектом WebdriverIO.

Источник: https://github.com/electron-userland/spectron#client

browser Объект для WebdriverIO не содержит getText функции (https://webdriver.io/docs/api.html ), однако извлеченный элемент действительно имеет рассматриваемую getText функцию.

Это должно решить вашу проблему:

 it("should have correct text", async () => {
  // because there are "two" windows...
  await app.client.windowByIndex(1);
  // use query selector to get h1
  const header = await app.client.$("h1");
  // grab the text from the element
  const h1Text = await header.getText();

  expect(h1Text).toEqual("💖 Hello World!");
});
 

Этот модульный тест в репозитории spectron указал мне правильное направление для этого решения.

Приветствия.

Ответ №2:

Вот что-то еще, что может просто работать для других.

Вы используете неверное утверждение. Вы хотите использовать:

 expect(headerText).to.equal("Hello World!");
 

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

     it("Check - Header Text", async function () {
        const headerElement = await app.client.$("h1"); 
        let headerText = await headerElement.getText();
        expect(headerText).to.equal("Hello World!");
    });
 

Если вы столкнетесь с ошибкой с помощью expect(), не возражайте добавить и это:

 const expect = require('chai').expect