組織和執行 Selenium 程式碼
內容協助
如果您想執行的腳本不只幾個一次性的腳本,您需要能夠組織和處理您的程式碼。本頁面應提供您關於如何實際使用 Selenium 程式碼來完成有效工作的想法。
常見用途
大多數人使用 Selenium 執行 Web 應用程式的自動化測試,但 Selenium 支援瀏覽器自動化的任何使用案例。
重複性任務
也許您需要登入網站並下載某些內容,或提交表單。您可以建立一個 Selenium 腳本,以便在預設時間與服務一起執行。
網路爬蟲
您是否希望從沒有 API 的網站收集數據?Selenium 可以讓您做到這一點,但請確保您熟悉網站的服務條款,因為某些網站不允許這樣做,其他網站甚至會封鎖 Selenium。
測試
執行 Selenium 進行測試需要對 Selenium 執行的動作進行斷言。因此,需要一個好的斷言函式庫。提供測試結構的其他功能需要使用測試執行器。
IDE
無論您如何使用 Selenium 程式碼,如果沒有良好的整合開發環境,您都無法有效地編寫或執行它。以下是一些常見的選項…
測試執行器
即使您不使用 Selenium 進行測試,如果您有進階的使用案例,使用測試執行器來更好地組織您的程式碼可能是有意義的。能夠使用前/後置鉤子並以群組或平行方式執行操作可能非常有用。
選擇
有許多不同的測試執行器可供使用。
本文件中的所有程式碼範例都可以在 (或正在移至) 我們的範例目錄中找到,這些目錄使用測試執行器,並且在每個版本發布時都會執行,以確保所有程式碼都是正確且更新的。以下是測試執行器的列表,並附有連結。第一個項目是此儲存庫使用的項目,也是本頁面上所有範例將使用的項目。
安裝
這與安裝 Selenium 函式庫中要求的內容非常相似。此程式碼僅顯示我們文件範例專案中使用的範例。
Maven
Gradle
若要在專案中使用它,請將其新增至 requirements.txt
檔案
在專案的 csproj
檔案中,將依賴項指定為 PackageReference
在 ItemGroup
中
新增至專案的 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
bundle exec rspec
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 文件的其餘部分。