组织和执行 Selenium 代码

使用 IDE 和测试运行器库扩展 Selenium 执行

如果您想运行不仅仅是少数几个一次性脚本,您需要能够组织和使用您的代码。此页面应该为您提供有关如何使用 Selenium 代码实际执行生产性操作的想法。

常见用途

大多数人使用 Selenium 来执行 Web 应用程序的自动化测试,但 Selenium 支持任何浏览器自动化的用例。

重复性任务

也许您需要登录网站并下载某些内容,或提交表单。您可以创建一个 Selenium 脚本,以在预设时间与服务一起运行。

网络抓取

您是否正在寻找从没有 API 的网站收集数据?Selenium 将允许您执行此操作,但请确保您熟悉网站的服务条款,因为某些网站不允许这样做,其他网站甚至会阻止 Selenium。

测试

运行 Selenium 进行测试需要在 Selenium 执行的操作上进行断言。因此,需要一个好的断言库。为测试提供结构的附加功能需要使用 测试运行器

IDE

无论您如何使用 Selenium 代码,如果没有良好的集成开发环境,您都无法非常有效地编写或执行它。以下是一些常见选项……

测试运行器

即使您不使用 Selenium 进行测试,如果您有高级用例,使用测试运行器来更好地组织代码也可能是有意义的。能够使用 before/after 钩子并并行或分组运行事物会非常有用。

选择

有许多不同的测试运行器可用。

此文档中的所有代码示例都可以在我们的示例目录中找到(或正在移动到该目录),这些目录使用测试运行器并且在每次发布时执行,以确保所有代码都是正确的并且已更新。以下是带有链接的测试运行器列表。第一项是此存储库使用的项,也是此页面上所有示例将使用的项。

  • JUnit - 用于基于 Java 的 Selenium 测试的广泛使用的测试框架。
  • TestNG - 提供诸如并行测试执行和参数化测试之类的额外功能。
  • pytest - 由于其简单性和强大的插件,是许多人的首选。
  • unittest - Python 的标准库测试框架。
  • NUnit - 用于 .NET 的流行的单元测试框架。
  • MS Test - Microsoft 自己的单元测试框架。
  • RSpec - 用于在 Ruby 中运行 Selenium 测试的最广泛使用的测试库。
  • Minitest - Ruby 标准库附带的轻量级测试框架。
  • Jest - 主要作为 React 的测试框架而闻名,它也可以用于 Selenium 测试。
  • Mocha - 用于运行 Selenium 测试的最常见的 JS 库。

安装

这与安装 Selenium 库中要求的内容非常相似。此代码仅显示我们的文档示例项目中使用的示例。

Maven

Gradle

要在项目中使用它,请将其添加到 requirements.txt 文件中

在项目的 csproj 文件中,在 ItemGroup 中将依赖项指定为 PackageReference

添加到项目的 gemfile

在您的项目的 package.json 中,将需求添加到 dependencies

断言

		String title = driver.getTitle();
		assertEquals("Web form", title);
    title = driver.title
    assert title == "Web form"
            var title = driver.Title;
            Assert.AreEqual("Web form", title);
    title = @driver.title
    expect(title).to eq('Web form')
    let title = await driver.getTitle();
    assert.equal("Web form", title);

设置和拆卸

设置

	@BeforeEach
	public void setup() {
		driver = new ChromeDriver();
	}

拆卸

	@AfterEach
	public void teardown() {
		driver.quit();
	}

设置

def setup():
    driver = webdriver.Chrome()
    driver.get("https://seleniumcn.cn/selenium/web/web-form.html")
    return driver

拆卸

def teardown(driver):
    driver.quit()

设置

  before do
    @driver = Selenium::WebDriver.for :chrome
  end

拆卸

  config.after { @driver&.quit }
### 设置
  before(async function () {
    driver = await new Builder().forBrowser('chrome').build();
  });
### 拆卸
  after(async () => await driver.quit());

执行

Maven

mvn clean test

Gradle

gradle clean test
pytest path/to/test_script.py

Mocha

mocha runningTests.spec.js

npx

npx mocha runningTests.spec.js

示例

第一个脚本中,我们看到了 Selenium 脚本的每个组件。以下是使用测试运行器的代码示例

package dev.selenium.getting_started;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.time.Duration;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class UsingSeleniumTest {

	WebDriver driver;

	@BeforeEach
	public void setup() {
		driver = new ChromeDriver();
	}

	@Test
	public void eightComponents() {

		driver.manage().timeouts().implicitlyWait(Duration.ofMillis(500));
		driver.get("https://seleniumcn.cn/selenium/web/web-form.html");

		String title = driver.getTitle();
		assertEquals("Web form", title);

		WebElement textBox = driver.findElement(By.name("my-text"));
		WebElement submitButton = driver.findElement(By.cssSelector("button"));

		textBox.sendKeys("Selenium");
		submitButton.click();

		WebElement message = driver.findElement(By.id("message"));
		String value = message.getText();
		assertEquals("Received!", value);

	}

	@AfterEach
	public void teardown() {
		driver.quit();
	}

}
from selenium import webdriver
from selenium.webdriver.common.by import By


def test_eight_components():
    driver = setup()

    title = driver.title
    assert title == "Web form"

    driver.implicitly_wait(0.5)

    text_box = driver.find_element(by=By.NAME, value="my-text")
    submit_button = driver.find_element(by=By.CSS_SELECTOR, value="button")

    text_box.send_keys("Selenium")
    submit_button.click()

    message = driver.find_element(by=By.ID, value="message")
    value = message.text
    assert value == "Received!"

    teardown(driver)

def setup():
    driver = webdriver.Chrome()
    driver.get("https://seleniumcn.cn/selenium/web/web-form.html")
    return driver

def teardown(driver):
    driver.quit()
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

namespace SeleniumDocs.GettingStarted
{
    [TestClass]
    public class UsingSeleniumTest
    {

        [TestMethod]
        public void EightComponents()
        {
            IWebDriver driver = new ChromeDriver();

            driver.Navigate().GoToUrl("https://seleniumcn.cn/selenium/web/web-form.html");

            var title = driver.Title;
            Assert.AreEqual("Web form", title);

            driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromMilliseconds(500);

            var textBox = driver.FindElement(By.Name("my-text"));
            var submitButton = driver.FindElement(By.TagName("button"));
            
            textBox.SendKeys("Selenium");
            submitButton.Click();
            
            var message = driver.FindElement(By.Id("message"));
            var value = message.Text;
            Assert.AreEqual("Received!", value);
            
            driver.Quit();
        }
    }
}
# frozen_string_literal: true
require 'spec_helper'
require 'selenium-webdriver'


RSpec.describe 'Using Selenium' do
  before do
    @driver = Selenium::WebDriver.for :chrome
  end

  it 'uses eight components' do
    @driver.get('https://seleniumcn.cn/selenium/web/web-form.html')

    title = @driver.title
    expect(title).to eq('Web form')

    @driver.manage.timeouts.implicit_wait = 500

    text_box = @driver.find_element(name: 'my-text')
    submit_button = @driver.find_element(tag_name: 'button')

    text_box.send_keys('Selenium')
    submit_button.click

    message = @driver.find_element(id: 'message')
    value = message.text
    expect(value).to eq('Received!')
  end
end
const {By, Builder} = require('selenium-webdriver');
const assert = require("assert");

describe('First script', function () {
  let driver;

  before(async function () {
    driver = await new Builder().forBrowser('chrome').build();
  });

  it('First Selenium script with mocha', async function () {
    await driver.get('https://seleniumcn.cn/selenium/web/web-form.html');

    let title = await driver.getTitle();
    assert.equal("Web form", title);

    await driver.manage().setTimeouts({implicit: 500});

    let textBox = await driver.findElement(By.name('my-text'));
    let submitButton = await driver.findElement(By.css('button'));

    await textBox.sendKeys('Selenium');
    await submitButton.click();

    let message = await driver.findElement(By.id('message'));
    let value = await message.getText();
    assert.equal("Received!", value);
  });

  after(async () => await driver.quit());
});

下一步

利用您所学的知识并构建您的 Selenium 代码!

当您发现更多需要的功能时,请阅读我们的其余 WebDriver 文档

上次修改时间 2024 年 9 月 2 日:删除了悬挂的徽章代码 (#1912) (d501255fa65)