Selenium 是一个有很多工具和库,可以用来支持浏览器自动化的项目
它能模拟用户与浏览器进行交互,实现 了W3C WebDriver 规范的基础架构 。
Selenium 的核心是WebDriver,可以理解为一个驱动包。
打开你的IDEA,新建一个空的Maven项目,
在项目文件中添加selenium-java依赖项:pom.xml
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.7.1</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-grid</artifactId>
<version>4.7.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
<!--下面这个依赖会根据你电脑安装的浏览器版本自动选择驱动(驱动管理)-->
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>5.2.3</version>
</dependency>
Selenium 所做的一切都是发送浏览器命令来做某事或发送信息请求。您将使用 Selenium 执行的大部分操作都是以下基本命令的组合:
WebDriver driver = new ChromeDriver();
在这个例子中,我们正在导航到一个网页。
driver.get("https://selenium.dev");
您可以请求有关浏览器的多种类型的信息,包括窗口句柄、浏览器大小/位置、cookie、警报等。
driver.getTitle(); // => "Google"
将代码与浏览器的当前状态同步是 Selenium 的最大挑战之一,而将其做好是一个高级主题。
本质上,您希望在尝试定位元素之前确保该元素位于页面上,并且在尝试与其交互之前该元素处于可交互状态。
隐式等待很少是最好的解决方案,但在这里最容易演示,因此我们将其用作占位符。
driver.manage().timeouts().implicitlyWait(Duration.ofMillis(500));
大多数 Selenium 会话中的大多数命令都是与元素相关的,如果不先找到元素,您就无法与之交互
WebElement searchBox = driver.findElement(By.name("q"));
WebElement searchButton = driver.findElement(By.name("btnK"));
对一个元素只有少量操作,但您会经常使用它们。
searchBox.sendKeys(“Selenium”);
searchButton.click();
元素存储了大量可以请求的信息。请注意,我们需要重新定位搜索框,因为自从我们第一次找到它之后 DOM 已经发生了变化。
driver.findElement(By.name("q")).getAttribute("value"); // => "Selenium"
这将结束驱动程序进程,默认情况下也会关闭浏览器。无法向此驱动程序实例发送更多命令。
driver.quit();
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class JDCrawler {
public static void main(String[] args) {
WebDriver driver = new ChromeDriver();
driver.get("https://baidu.com");
driver.quit();
}
}