轻松入门自动化测试:Selenium

/ 技术 / 2 条站内评论 / 534浏览

前言

Selenium 是什么?一句话,自动化测试工具。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的插件,那么便可以方便地实现Web界面的测试。同时也可以进行数据的爬虫抓取!Selenium测试直接运行在浏览器中,就像真正的用户在操作一样!!!

官网

SelenIUM官网

环境配置

下载驱动

chromedriver.exe (对应谷歌浏览器 版本 67.0.3396.87(正式版本) (64 位)

注意

selenium和chromdriver版本是有关联的,可以参考下这个文章:https://blog.csdn.net/huilan_same/article/details/51896672

如果想使用其他浏览器,自行百度。

支持的浏览器

Selenium-WebDriver 支持如下浏览器,在所有支持这些浏览器的操作系统中能都运行良好。

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"));

查找链接文字匹配的链接元素。

HTML:

<a href="http://www.google.com/search?q=cheese">cheese</a>>

Java:

WebElement cheese = driver.findElement(By.linkText("cheese"));

查找链接文字部分匹配的链接元素。

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&lt;Boolean&gt;() {
        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;
}
}
}

效果图

对博客首页所有文章进行逐个评论~(实际速度是很快的,因为录屏电脑很卡慢了很多)


  1. SAn

    selenIUM自动测试:轻松入门自动化测试:Selenium - SAn Blog

    回复
  2. SAn

    selenIUM自动测试:轻松入门自动化测试:Selenium - SAn Blog

    回复
召唤蕾姆
琼ICP备18000156号

鄂公网安备 42011502000211号