selenium-webdriver 前端自动化测试1

104 阅读1分钟

目前计划使用脚本进行一部分浏览器内交互的自动化测试,选用了selenium-webdriver框架来具体实现,中间遇到了一些问题和实现,记录在此。

1 安装

图片.png

安装核心基础类库。 代码均使用Typescript编写,所以此项目安装了Typescript和ts-node-dev本地服务。

2 启动(以chrome为例)

import { Builder } from "selenium-webdriver"
import { Options } from "selenium-webdriver/chrome"
import { logger } from "./logger/logger"
import { run } from "./tests"
import { defaultChromePath, defaultChromeUserDataPath, startupUrl } from "./model/option"

try {
    ;(async () => {
        const options = new Options()
        options
            .setChromeBinaryPath(defaultChromePath)
            .addArguments(`--user-data-dir=${defaultChromeUserDataPath}`)
            .addArguments("--ignore-certificate-errors")
            .addArguments("--ignore-ssl-errors")
        const driver = await new Builder().forBrowser("chrome").setChromeOptions(options).build()
        await driver.get(startupUrl)
        await run(driver)
    })()
} catch (e) {
    logger.error(e)
}

3说明

以下是启动配置文件,里面是本机chrome安装位置,以及使用的用户数据。当然你可以不指定,但是这样的话,浏览器将会使用一个空白的用户来启动,里面不会包含任何历史数据,保存的用户名密码,缓存等。

// ./mode/option.ts 文件
export const defaultChromePath = `C:\\chrome-install-path\\chrome.exe`

export const defaultChromeUserDataPath = "C:\\Users\\Username\\AppData\\Local\\Google\\Chrome\\User Data"

export const startupUrl = "http://localhost:8080"

4 用例

// ./tests 默认用例示意
import { WebDriver } from "selenium-webdriver"
import dayjs from "dayjs"
import { logger } from "../logger/logger"
import { login } from "./login"

async function showTimeCost(desc: string, action: () => Promise<void>) {
    const start = new Date()
    await action()
    const now = new Date()
    const costM = dayjs(now).diff(start, "minute")
    const costS = dayjs(now).diff(start, "second")
    const cost = costM ? `${costM}分钟` : `${costS}秒`
    logger.log(`运行任务[${desc}]时间花费:${cost}`)
}

export async function run(driver: WebDriver) {
    showTimeCost("全项目", async () => {
        await login(driver)
        ...其他用例
        logger.log(`所有测试任务都已完成`)
    })
}

5 下篇记录下使用中遇到的问题,和部分交互行为如何触发