前言
Selenium 是什么?一句话,自动化测试工具。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的插件,那么便可以方便地实现Web界面的测试。同时也可以进行数据的爬虫抓取!Selenium测试直接运行在浏览器中,就像真正的用户在操作一样!!!
官网
环境配置
下载驱动
chromedriver.exe (对应谷歌浏览器 版本 67.0.3396.87(正式版本) (64 位))
注意
selenium和chromdriver版本是有关联的,可以参考下这个文章:https://blog.csdn.net/huilan_same/article/details/51896672
如果想使用其他浏览器,自行百度。
支持的浏览器
Selenium-WebDriver 支持如下浏览器,在所有支持这些浏览器的操作系统中能都运行良好。
- Google Chrome 12.0.712.0+
- Internet Explorer 6, 7, 8, 9 - 32 and 64-bit where applicable
- Firefox 3.0, 3.5, 3.6, 4.0, 5.0, 6, 7
- Opera 11.5+
- HtmlUnit 2.9
- Android – 2.3+ for phones and tablets (devices & emulators)
- iOS 3+ for phones (devices & emulators) and 3.2+ for tablets (devices & emulators)
maven依赖
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.3.1</version>
</dependency>
基本API
代码连接驱动
谷歌浏览器
System.setProperty("webdriver.chrome.driver", chromedriver);
WebDriver driver = new ChromeDriver();
driver.get("https://sanii.cn");
火狐浏览器:WebDriver driver = new FirefoxDriver();
注意setProperty也要改成
webdriver.firefoxd.driver
Selenium-WebDriver API 和操作
获取一个页面
访问一个页面或许是使用 WebDriver 时你第一件想要做的事情。最常见的是调用 “get” 方法:
driver.get("http://www.google.com");
包括操作系统和浏览器在内的多种因素影响,WebDriver 可能会也可能不会等待页面加载。在某些情况下,WebDriver可能在页面加载完毕前就返回控制了,甚至是开始加载之前。为了确保健壮性,你需要使用 Explicit and Implicit Waits 等到页面元素可用。
查找 UI 元素(web 元素)
WebDriver 实例可以查找 UI 元素。每种语言实现都暴露了 “查找单个元素” 和 “查找所有元素” 的方法。第一个方法如果找到则返回该元素,如果没找到则抛出异常。第二种如果找到则返回一个包含所有元素的列表,如果没找到则返回一个空数组。
“查找” 方法使用了一个定位器或者一个叫 “By” 的查询对象。“By” 支持的元素查找策略如下:
By id
这是最高效也是首选的方法用于查找一个元素。UI 开发人员常犯的错误是,要么没有指定 id,要么自动生成随机 id,这两种情况都应避免。及时是使用 class 也比使用自动生成随机 id 要好的多。
HTML:
<div id="coolestWidgetEvah">...</div>
Java:
WebElement element = driver.findElement(By.id("coolestWidgetEvah"));
By Class Name
"class" 是 DOM 元素上的一个属性。在实践中,通常是多个 DOM 元素有同样的 class 名,所以通常用它来查找多个元素。
HTML:
<div class="cheese"><span>Cheddar</span></div><div class="cheese"><span>Gouda</span></div>
Java:
List<WebElement> cheeses = driver.findElements(By.className("cheese"));
By Tag Name
根据元素标签名查找。
HTML:
<iframe src="..."></iframe>
Java:
WebElement frame = driver.findElement(By.tagName("iframe"));
By Name
查找 name 属性匹配的表单元素。
HTML:
<input name="cheese" type="text"/>
Java:
WebElement cheese = driver.findElement(By.name("cheese"));
By Link Text
查找链接文字匹配的链接元素。
HTML:
<a href="http://www.google.com/search?q=cheese">cheese</a>>
Java:
WebElement cheese = driver.findElement(By.linkText("cheese"));
By Partial Link Text
查找链接文字部分匹配的链接元素。
HTML:
<a href="http://www.google.com/search?q=cheese">search for cheese</a>>
Java:
WebElement cheese = driver.findElement(By.partialLinkText("cheese"));
By CSS
正如名字所表明的,它通过 css 来定位元素。默认使用浏览器本地支持的选择器,可参考 w3c 的 css 选择器。如果浏览器默认不支持 css 查询,则使用 Sizzle。ie6、7 和 ff3.0 都使用了 Sizzle。
注意使用 css 选择器不能保证在所有浏览器里都表现一样,有些在某些浏览器里工作良好,在另一些浏览器里可能无法工作。
HTML:
<div id="food"><span class="dairy">milk</span><span class="dairy aged">cheese</span></div>
Java:
WebElement cheese = driver.findElement(By.cssSelector("#food span.dairy.aged"));
更多详情可以参考官网:https://wizardforcel.gitbooks.io/selenium-doc/content/official-site/selenium-web-driver.html
执行JS代码
((JavascriptExecutor)driver).executeScript("document.getElementById('ID').value='Value'");
上面这个挺使用的,比如:在日期选择的时候,如果通过DOM节点去模拟点击操作的话,非常复杂,而且每个月份对应的日期都不一样,这时候我们就可以通过JS强制修改日期的值。
操作DOM
使用以上API获取到页面节点后,我们就可以对其DOM进行操作。
实例介绍 Selenium-WebDriver API
WebDriver 是一个进行 web 应用测试自动化的工具,主要用于验证它们的行为是否符合期望。WebDriver 的目标是提供一套易于掌握的 API,且比 Selenium-RC (1.0) 更易于使用,页能是你的测试更具可读性和维护性。它没有同任何特定的测试框架进行绑定,所以可以在单元测试或者是 main 方法中工作良好。本小节介绍 WebDriver API,并且帮助你熟悉它。如果你还没有任何 WebDriver 项目,请按照上一小节的介绍新建一个。
建好项目后,你可以发现 WebDriver 和任何普通的库一样:它是自包含的,通常不需要进行任何额外的处理或者运行安装。这一点和 Selenium-RC 的代理服务器是不一样的。
注意: 使用 Chrome Driver、 Opera Driver、Android Driver 和 iPhone Driver 是需要一些额外操作的。
我们准备了一个简单的例子:在 Google 上搜索 “Cheese”,然偶输出搜索结果页的页面标题到 console。
package org.openqa.selenium.example;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
public class Selenium2Example {
public static void main(String[] args) {
// 创建了一个 Firefox driver 的实例
// 注意,其余的代码依赖于接口而非实例
WebDriver driver = new FirefoxDriver();
// 使用它访问 Google
driver.get("http://www.google.com");
// 同样的事情也可以通过以下代码完成
// driver.navigate().to("http://www.google.com");
// 找到搜索输入框
WebElement element = driver.findElement(By.name("q"));
// 输入要查找的词
element.sendKeys("Cheese!");
// 提交表单
element.submit();
// 检查页面标题
System.out.println("Page title is: " + driver.getTitle());
// Google 搜索结果由 JavaScript 动态渲染
// 等待页面加载完毕,超时时间设为10秒
(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
return d.getTitle().toLowerCase().startsWith("cheese!");
}
});
//应该能看到: "cheese! - Google Search"
System.out.println("Page title is: " + driver.getTitle());
//关闭浏览器
driver.quit();
}
}
在接下来的章节中,你将学习到更多使用 WebDriver 的知识,例如根据浏览器历史记录前进和后退,如何测试 frames 和 windows。针对这些点我们提供了全面的讨论和范例。
下面贴一下自己对本站首页所有文章进行循环评论的代码:
package blog;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.util.List;
/
* @Auther: shouliang.wang
* @Date: 2018/7/2 15:56
* @Description:
*/
public class saniiIUM {
public static void main(String[] args) {
String chromedriver = saniiIUM.class.getClassLoader().getResource("chromedriver.exe").toString();
//window环境下获取到的路径前缀多了file:/导致获取不到驱动
if (chromedriver.indexOf("file:/") == 0) {
chromedriver = chromedriver.substring(6);
}
System.setProperty("webdriver.chrome.driver", chromedriver);
WebDriver driver = new ChromeDriver();
driver.get("https://sanii.cn");
//获取每个文章的节点
List<WebElement> itemTitle = driver.findElements(By.className("item-title"));
for (int x = 0; x < itemTitle.size(); x++) {
driver.get("https://sanii.cn");
WebElement a = driver.findElements(By.className("item-title")).get(x).findElement(By.tagName("a"));
a.click();
// 等待页面加载完毕,超时时间设为3秒
(new WebDriverWait(driver, 3)).until(new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver d) {
return isLoad(d);//这里对加了校验,如果不加校验,当页面DOM还没加载完成时去获取了DOM节点,此时会抛异常。这里对DOM进行校验,如果节点存在则往下走,抛异常则继续等待3秒。
}
});
//因为站点对评论的表单进行了校验,同时表单的值会自动使用cookie赋值,因此会造成重复赋值校验失败 : 例如1300100082@qq.com1300100082@qq.com
driver.findElement(By.id("author")).clear();//赋值前清空表格
driver.findElement(By.id("author")).sendKeys("SAn");//赋值
driver.findElement(By.id("mail")).clear();
driver.findElement(By.id("mail")).sendKeys("1300100082@qq.com");
driver.findElement(By.id("url")).clear();
driver.findElement(By.id("url")).sendKeys("https://sanii.cn");
driver.findElement(By.id("textarea")).sendKeys("selenIUM自动测试:" + driver.getTitle());
driver.findElement(By.id("misubmit")).submit();对
}
}
/
* 检查节点是否加载完成
* @param d
* @return
*/
public static boolean isLoad(WebDriver d) {
try {
d.findElement(By.id("author")).clear();
return true;
} catch (Exception e) {//节点不存在则抛异常
return false;
}
}
}
效果图
对博客首页所有文章进行逐个评论~(实际速度是很快的,因为录屏电脑很卡慢了很多)
本文由 SAn 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2018/07/06 21:15
selenIUM自动测试:轻松入门自动化测试:Selenium - SAn Blog
selenIUM自动测试:轻松入门自动化测试:Selenium - SAn Blog