組織和執行 Selenium 程式碼

使用 IDE 和測試執行器函式庫擴展 Selenium 執行

如果您想執行的腳本不只幾個一次性的腳本,您需要能夠組織和處理您的程式碼。本頁面應提供您關於如何實際使用 Selenium 程式碼來完成有效工作的想法。

常見用途

大多數人使用 Selenium 執行 Web 應用程式的自動化測試,但 Selenium 支援瀏覽器自動化的任何使用案例。

重複性任務

也許您需要登入網站並下載某些內容,或提交表單。您可以建立一個 Selenium 腳本,以便在預設時間與服務一起執行。

網路爬蟲

您是否希望從沒有 API 的網站收集數據?Selenium 可以讓您做到這一點,但請確保您熟悉網站的服務條款,因為某些網站不允許這樣做,其他網站甚至會封鎖 Selenium。

測試

執行 Selenium 進行測試需要對 Selenium 執行的動作進行斷言。因此,需要一個好的斷言函式庫。提供測試結構的其他功能需要使用測試執行器

IDE

無論您如何使用 Selenium 程式碼,如果沒有良好的整合開發環境,您都無法有效地編寫或執行它。以下是一些常見的選項…

測試執行器

即使您不使用 Selenium 進行測試,如果您有進階的使用案例,使用測試執行器來更好地組織您的程式碼可能是有意義的。能夠使用前/後置鉤子並以群組或平行方式執行操作可能非常有用。

選擇

有許多不同的測試執行器可供使用。

本文件中的所有程式碼範例都可以在 (或正在移至) 我們的範例目錄中找到,這些目錄使用測試執行器,並且在每個版本發布時都會執行,以確保所有程式碼都是正確且更新的。以下是測試執行器的列表,並附有連結。第一個項目是此儲存庫使用的項目,也是本頁面上所有範例將使用的項目。

  • JUnit - 一個廣泛使用的測試框架,適用於基於 Java 的 Selenium 測試。
  • TestNG - 提供額外功能,例如平行測試執行和參數化測試。
  • pytest - 由於其簡單性和強大的外掛程式,是許多人的首選。
  • unittest - Python 的標準函式庫測試框架。
  • NUnit - 一個流行的 .NET 單元測試框架。
  • MS Test - Microsoft 自己的單元測試框架。
  • RSpec - 最廣泛使用的測試函式庫,用於在 Ruby 中執行 Selenium 測試。
  • Minitest - 一個輕量級測試框架,隨附於 Ruby 標準函式庫。
  • Jest - 主要以 React 的測試框架而聞名,它也可以用於 Selenium 測試。
  • Mocha - 最常見的 JS 函式庫,用於執行 Selenium 測試。

安裝

這與安裝 Selenium 函式庫中要求的內容非常相似。此程式碼僅顯示我們文件範例專案中使用的範例。

Maven

Gradle

若要在專案中使用它,請將其新增至 requirements.txt 檔案

在專案的 csproj 檔案中,將依賴項指定為 PackageReferenceItemGroup

新增至專案的 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://selenium.dev.org.tw/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://selenium.dev.org.tw/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://selenium.dev.org.tw/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://selenium.dev.org.tw/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://selenium.dev.org.tw/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://selenium.dev.org.tw/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)