Selenium 浏览器自动化项目
Selenium 是一个涵盖多种工具和库的项目,旨在支持和实现对 Web 浏览器的自动化。
它提供了扩展来模拟用户与浏览器的交互,一个用于扩展浏览器分配的分发服务器,以及符合 W3C WebDriver 规范的基础设施,使您能够为所有主要的 Web 浏览器编写可互换的代码。
这个项目得以实现,得益于那些自愿贡献的志愿者,他们投入了数千小时的个人时间,并将源代码免费提供给任何人使用、享受和改进。
Selenium 将浏览器供应商、工程师和热衷者聚集在一起,促进了关于 Web 平台自动化的开放讨论。该项目每年都会组织一次会议,以教授和培养社区。
在 Selenium 的核心是 WebDriver,它是一个编写指令集的接口,可以在许多浏览器中互换运行。
一旦您安装好一切,只需几行代码,您就可以进入浏览器。
您可以在《编写您的第一个 Selenium 脚本》中找到更详细的示例。
java 例子
package dev.selenium.hello;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class HelloSelenium {
public static void main(String[] args) {
WebDriver driver = new ChromeDriver();
driver.get("https://selenium.dev");
driver.quit();
}
}
入门指南
如果您是初次接触 Selenium,我们有一些资源可以帮助您立即掌握要领。
Selenium 支持通过 WebDriver 实现对市场上所有主要浏览器的自动化。
WebDriver 是一个 API 和协议,定义了一种与控制 Web 浏览器行为的语言无关的接口。
每个浏览器都由一个特定的 WebDriver 实现支持,称为驱动程序。驱动程序是将指令传递给浏览器并处理 Selenium 与浏览器之间通信的组件。
这种分离是有意为之的,目的是让浏览器供应商对其浏览器的实现负责。Selenium 尽可能利用这些第三方驱动程序,但也为那些这不是现实的情况提供了由项目维护的自己的驱动程序。
Selenium 框架通过用户界面将所有这些部分联系在一起,使不同的浏览器后端能够透明地使用,实现跨浏览器和跨平台的自动化。
Selenium 的设置与其他商业工具的设置非常不同。在您可以开始编写 Selenium 代码之前,您必须安装所选语言的语言绑定库、要使用的浏览器以及该浏览器的驱动程序。
请按以下链接了解如何使用 Selenium WebDriver。
如果您想使用低代码/录制和回放工具开始,请查看 Selenium IDE。
一旦您使一切正常运行,如果您想扩大测试范围,请查看 Selenium Grid。
安装 lib
设置您喜欢的编程语言的 Selenium 库。
首先,您需要为自动化项目安装 Selenium 绑定。库的安装过程取决于您选择使用的语言。
确保您查看 Selenium 下载页面,以确保您使用的是最新版本。
以 java maven 为例子
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.16.1</version>
</dependency>
第一个脚本
八个基本组件
Selenium 所做的一切都是向浏览器发送命令以执行某些操作或发送请求获取信息。您在使用 Selenium 时将主要使用这些基本命令的组合。
点击链接“在 GitHub 上查看完整示例”以查看上下文中的代码。
1. 启动会话
WebDriver driver = new ChromeDriver();
2. 执行动作
driver.get("https://www.selenium.dev/selenium/web/web-form.html");
3. 请求浏览器信息
driver.getTitle();
4. 建立等待策略
与浏览器的当前状态同步代码是使用 Selenium 面临的最大挑战之一,而良好地执行这一点是一个高级话题。
基本上,您希望确保在尝试定位元素之前该元素在页面上,且在尝试与之交互之前该元素处于可交互状态。
隐式等待很少是最佳解决方案,但在这里它是最容易演示的,因此我们将其用作占位符。
阅读有关等待策略的更多信息。
driver.manage().timeouts().implicitlyWait(Duration.ofMillis(500));
5. 发现一个元素
WebElement textBox = driver.findElement(By.name("my-text"));
WebElement submitButton = driver.findElement(By.cssSelector("button"));
6. 元素上执行动作
textBox.sendKeys("Selenium");
submitButton.click();
7. 请求元素信息
message.getText();
8. 退出
driver.quit();
实际使用
如果您想运行超过少数一次性脚本,您需要能够组织和处理您的代码。这一页应该为您提供如何实际用 Selenium 代码执行有意义的任务的想法。
常见用途
大多数人使用 Selenium 执行 Web 应用程序的自动化测试,但 Selenium 支持浏览器自动化的任何用例。
重复性任务
也许您需要登录到网站并下载一些东西,或者提交一个表单。您可以创建一个 Selenium 脚本,定期在预设时间运行。
网页抓取
您是否希望从一个没有 API 的网站收集数据?Selenium 可以帮助您做到这一点,但请确保您熟悉该网站的服务条款,因为有些网站不允许这样做,而其他网站甚至会阻止 Selenium。
测试
在测试中运行 Selenium 需要对 Selenium 执行的操作进行断言。因此,需要一个良好的断言库。为测试提供结构的其他功能需要使用测试运行器。
代码合并
把上面的代码合并:
package dev.selenium.getting_started;
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;
import java.time.Duration;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class UsingSeleniumTest {
@Test
public void eightComponents() {
WebDriver driver = new ChromeDriver();
driver.get("https://www.selenium.dev/selenium/web/web-form.html");
String title = driver.getTitle();
assertEquals("Web form", title);
driver.manage().timeouts().implicitlyWait(Duration.ofMillis(500));
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);
driver.quit();
}
}