Selenium是一个自动化测试工具且十分强大的Web应用自动化框架。利用它可以驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到可见即可爬。它能模拟用户与浏览器进行交互,我们可以通过它来自动操控浏览器。
本文主要使用的环境为
- Jdk:1.8,
- selenium-java:4.7.1
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.7.1</version>
</dependency>
下面就直接开始介绍有那些常用操作吧!
- 创建浏览器对象
ChromeDriver browser = new ChromeDriver();
EdgeDriver edgeDriver = new EdgeDriver();
FirefoxDriver firefoxDriver = new FirefoxDriver();
InternetExplorerDriver internetExplorerDriver = new InternetExplorerDriver();
SafariDriver safariDriver = new SafariDriver();
- 跳转页面
driver.get(url); 请求一个页面,不支持前进和后退切换
driver.navigate().to(url); 和get类似,支持前进和后退切换
driver.navigate().back(); 退到上一个页面 ,前提必须前进了一个页面才能回退
driver.navigate().forward(); 指前进到下一个页面 ,前提是必须后退后才能前进
driver.navigate().refresh(); 刷新当前页面
- 获取页面元素
方法描述参数示例
findElement(By.id())通过元素的 id 属性值来定位元素对应的id属性值findElement(By.id("order_id"))
findElement(By.name())通过元素的 name 属性值来定位元素对应的name值findElement(By.name("user"))
findElement(By.className())通过元素的 class 名来定位元素对应的class类名findElement(By.className("order_class"))
findElement(By.tagName())通过元素的 tag 标签名来定位元素对应的标签名findElement(By.tagName("input"))
findElement(By.linkText())通过元素标签对之间的文本信息来定位元素文本内容findElement(By.linkText("新闻"))
findElement(By.partialLinkText())通过元素标签对之间的部分文本信息来定位元素部分文本内容findElement(By.partialLinkText("新"))
findElement(By.xpath())通过xpath语法来定位元素xpath表达式findElement(By.xpath("//input[@id='order_id']"))
findElement(By.cssSelector())通过css选择器来定位元素css元素选择器findElement(By.cssSelector("#order_id"))
同时还有提供复数形式的API,用于返回多个数据的集合。
- 使用案例展示
<html>
<head>
<body link="#0000cc">
<a id="go_cart" href="/" >
<a class="news" href="http://news.baidu.com" name="baidu_news">新闻</a>
<form id="form" class="order_form" name="form_name" action="/payOrder">
<div class=”order_div”>
<span class="go-btn">立即够买</span>
<input id="order_id" class="order_class" name="order_name" value="" />
</div>
</form>
</body>
</html>
我们的目的是要定位input标签的输入框。
通过id定位:
driver.findElement(By.id("order_id"))
通过name定位:
driver.findElement(By.name("order_name"))
通过class name定位:
driver.findElement(By.className("order_class"))
通过tag name定位:
driver.findElement(By.tagName("input"))
通过xpath定位,xpath定位有N种写法,这里列几个常用写法:
driver.findElement(By.xpath("//*[@id='order_id']")) // id定位
driver.findElement(By.xpath("//*[@name='order_name']")) // 属性值定位
driver.findElement(By.xpath("//input[@class='order_class']")) // class属性定位
driver.findElement(By.xpath("/html/body/form/input")) // 绝对路径定位
driver.findElement(By.xpath("//div[@class='order_div']/input")) // 相对路径定位
driver.findElement(By.xpath("//input[@id='order_id' and @name='order_name']")) // 多组合属性定位
获取span元素
driver.findElement(By.xpath("//span[text()='立即够买']")) // 文本定位
driver.findElement(By.xpath("//span[contains(text(),'立即够买')]")) // 是否包含文本获取到span元素
接下来,我们的页面上有一组文本链接。
通过linkText定位:
driver.findElement(By.linkText("新闻")
通过 partialLinkText 定位:
driver.findElement(By.partialLinkText("新")
- WebElement 常用 API
通过 WebElement 实现与网站页面上元素的交互,这些元素包含文本框、文本域、按钮、单选框、div等,WebElement提供了一系列的方法对这些元素进行操作:
方法 描述
click() 对元素进行点击
clear() 清空内容(如文本框内容)
sendKeys(...) 写入内容与模拟按键操作
isDisplayed() 元素是否可见(true:可见,false:不可见)
isEnabled() 元素是否启用
isSelected() 元素是否已选择
getTagName() 获取元素标签名
getAttribute(attributeName) 获取元素对应的属性值
getText() 获取元素文本值(元素可见状态下才能获取到)
submit() 表单提交