【问题标题】:Jest + Selenium: how do I do an operation before and after all tests inside a describe block is run?Jest + Selenium:在运行描述块内的所有测试之前和之后如何进行操作?
【发布时间】:2021-07-07 17:51:56
【问题描述】:

我正在尝试创建一个简单的自动化测试来检测添加的元素是否包含它应该具有的文本。使用带有jest 命令的node.js 运行测试。我正在使用 Selenium 来自动化 UI 流程,并使用 Jest 来验证 UI 的内容。

我想做以下事情。

  • 在运行任何测试之前,在describe块中的所有tests中创建可访问的变量
  • describe 块中的所有 tests 运行后关闭 Selenium 驱动的浏览器

到目前为止,我有这个代码。

const { Builder, By, until } = require('selenium-webdriver')
const url = 'http://127.0.0.1:3000'

describe('addUser', async() => {
    afterAll(async() => {
        await driver.quit()
    }, 15000)

    test('valid name and age should add a new element', async() => {
        const driver = await new Builder().forBrowser('firefox').build()
        await driver.get(url)
        const nameField = await driver.wait(until.elementLocated(By.id('name')), 10000)
        const ageField = await driver.wait(until.elementLocated(By.id('age')), 10000)
        const btnAddUser = await driver.wait(until.elementLocated(By.id('btnAddUser')), 10000)
        await nameField.click()
        await nameField.sendKeys('Adam')
        await ageField.click()
        await ageField.sendKeys('39')
        await btnAddUser.click()
        const userItem = await driver.wait(until.elementLocated(By.css('.user-item')), 10000)
        const userItemText = await userItem.getText()
        expect(userItemText).toBe('Adam (39 years old)')
    }, 10000)
})

我面临的问题如下。

  • 我必须声明driver,要求driver 打开一个新页面,并在每次运行测试时找到所有必要的元素。如果可能的话,我想在beforeAll 函数(通过 Jest)中执行这些初始化步骤,并以某种方式存储变量。然后,我可以在每个测试中使用drivernameFieldageField 等,而无需再次声明它们。在保持干净代码的同时,我将如何做到这一点?
  • addUser describe 块内的所有测试运行后,我将关闭 Selenium 驱动的浏览器。所以,我在afterAll (Jest) 中添加了driver.quit() 来关闭浏览器。不幸的是,这不起作用。浏览器不会自行关闭。如何在每个 describe 块之后关闭 Selenium 操作的浏览器?

测试很好,但是我该如何解决上面的两个问题?

【问题讨论】:

  • driver 在测试范围内声明,在 afterAll 中不可用。为每个测试使用单独的驱动程序,在 beforeEach 中定义它们并在 afterEach 中执行 driver.quit()。或者重用同一个驱动,在 beforeAll 中定义,在 afterAll 中做 driver.quit()。
  • @EstusFlask 我尝试在beforeAll 中定义driver, nameField, ageField, and btnAddUser。但是,当我尝试访问test 中的nameFieldageFieldbtnAddUser 时,它说nameField 没有定义。
  • 如果您在 beforeAll(let 等)中声明变量,它们在测试中将不可见。这是特定于 JS 而不是 Jest,您可能需要检查变量范围。你当然不需要 beforeAll 中的 nameField 等,因为它们是特定于这个测试的,而驱动程序不是。

标签: selenium selenium-webdriver jestjs


【解决方案1】:

driver 变量在test 范围内声明,在afterAll 中不可用。即使它是在describe 范围内声明的,也只会对最后一个driver 执行拆卸,因为可以有多个测试,但afterAll 在最后一个之后调用。

可以为每个测试重新定义需要拆卸的变量:

let driver;

beforeEach(async () => {
  driver = ...
});

afterEach(async () => {
  await driver.quit()
});

或重复用于所有测试:

let driver;

beforeAll(async () => {
  driver = ...
});

afterAll(async () => {
  await driver.quit()
});

【讨论】:

  • 谢谢,这就是我想要的。我不知道为什么我以前不能在describe 范围内定义let;我一定错过了一些东西(我已经尝试过你以前做过的事情,但我想我输入错误或配置错误)。
猜你喜欢
  • 2019-07-19
  • 2015-05-30
  • 2013-01-24
  • 2020-03-04
  • 1970-01-01
  • 2016-08-21
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
相关资源
最近更新 更多