概述
软件测试之自动化测试Selenium-java入门
- Selenium自动化测试实战PDF
- Selenium在Java下的安装与使用
- 常见的定位元素
- Selenium的一些基本用法
- 鼠标事件
- 键盘事件keys
- 设置元素等待
- 定位一组元素
- frame切换
- 多窗口切换
- 提示框的处理
- 操作cookie
- 操作JavaScript
- 截图
- Selenium Chrome IDE下载
- Selenium Chrome IDE入门案例
- testNg的安装与使用
- testNg依赖测试
- testNg忽略测试
- testNg参数化测试(DataProvider)
- testNg参数化测试(xml)
- testNg超时测试
- Selenium Grid安装及使用
- 多浏览器多节点单线程执行用例
- 多浏览器多节点多线程执行用例
Selenium自动化测试实战PDF
百度云盘,提取码:test
Selenium在Java下的安装与使用
- 环境:JDK1.8
- IDE:IntelliJ IDEA 2021.2/Eclispe
- 浏览器:Chrome
第一步:下载Selenium,下载链接
第二步:通过maven对jar进行管理,引入Selenium坐标。
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
</dependencies>
第三步:编写脚本。注意的是,如果浏览器如Chrome,Firefox等浏览器未装在其默认安装位置,需手动下载对应版本的驱动,并自行进行加载。否则会报The path to the driver executable must be set by the webdriver.chrome.driver system property;
的错误。
public class baidu {
public static void main(String[] args) throws InterruptedException {
System.out.println("srart selenium");
//谷歌浏览器没有装在指定位置的话,需要手动进行设置驱动driver
System.setProperty("webdriver.chrome.driver", "D:/Solfware/Selenium/ChromeDriver/chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().deleteAllCookies();
// 与浏览器同步非常重要,必须等待浏览器加载完毕
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
//目标地址
driver.get("http://www.baidu.com/");
//根据百度页面元素,找到对应的标签并进行操作
driver.findElement(By.id("kw")).sendKeys("selenium java");
driver.findElement(By.id("su")).click();
Thread.sleep(3000);
driver.close();
}
}
常见的定位元素
- id:
findElement(By.id("kw"))
- name:
findElement(By.name("wd"))
- class name:
findElement(By.className("s_ipt"))
- link text:
findElement(By.linkText("新闻"))
- cssSelector:
findElement(By.cssSelector())
- XPath:可以通过谷歌浏览器的插件ChroPath自动帮我们获取XPath路径
Selenium的一些基本用法
-
控制浏览器窗口大小:
driver.manage().window().
-
控制浏览器前进后退:
driver.navigate()
-
控制浏览器刷新:
driver.navigate().refresh()
- 定位元素后的一些简单基本操作
public interface WebElement extends SearchContext, TakesScreenshot {
/**
* Click this element. If this causes a new page to load, you
* should discard all references to this element and any further
* operations performed on this element will throw a
* StaleElementReferenceException.
* * Note that if click() is done by sending a native event (which is
* the default on most browsers/platforms) then the method will
* _not_ wait for the next page to load and the caller should verify
* that themselves.
* * There are some preconditions for an element to be clicked. The
* element must be visible and it must have a height and width
* greater then 0.
* * @throws StaleElementReferenceException If the element no
* longer exists as initially defined
*/
//点击操作
void click();
//提交操作,相当于回车进行提交。在与click上有些时候有异曲同工之妙
void submit();
//添加内容,输入内容
void sendKeys(CharSequence... keysToSend);
//清空
void clear();
String getTagName();
//获得属性值
String getAttribute(String name);
//是否被选中
boolean isSelected();
boolean isEnabled();
//获取元素的文本。
String getText();
List<WebElement> findElements(By by);
WebElement findElement(By by);
//设置该元素是否用户可见。
boolean isDisplayed();
Point getLocation();
//返回元素的尺寸
Dimension getSize();
Rectangle getRect();
String getCssValue(String propertyName);
}
鼠标事件
- contextClick() 右击
- clickAndHold() 鼠标点击并控制
- doubleClick() 双击
- dragAndDrop() 拖动
- release() 释放鼠标
- perform() 执行所有 Actions 中存储的行为
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import java.util.concurrent.TimeUnit;
public class actions {
public static final String DRIVER_NAME = "webdriver.chrome.driver";
public static final String DRIVER_LOCATION = "D:/Solfware/Selenium/ChromeDriver/chromedriver.exe";
public static void main(String[] args) throws InterruptedException {
System.setProperty(DRIVER_NAME, DRIVER_LOCATION);
WebDriver driver = new ChromeDriver();
// 与浏览器同步非常重要,必须等待浏览器加载完毕
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
driver.manage().window().maximize();
//目标地址
driver.get("http://www.baidu.com/");
//将driver作为参数传入开启鼠标点击事件actions
Actions actions = new Actions(driver);
//这里可以选择替换为别的事件
actions.clickAndHold(driver.findElement(By.xpath("//span[@id='s-usersetting-top']"))).perform();
Thread.sleep(1000);
}
}
键盘事件keys
public class keyboard {
public static void main(String[] args) throws InterruptedException {
System.setProperty("webdriver.chrome.driver", "D:/Solfware/Selenium/ChromeDriver/chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://www.baidu.com");
WebElement input = driver.findElement(By.id("kw"));
//输入框输入内容
input.sendKeys("seleniumm");
Thread.sleep(500);
//删除多输入的一个 m
input.sendKeys(Keys.BACK_SPACE);
//输入空格键+“教程”
Thread.sleep(500);
input.sendKeys(Keys.SPACE);
Thread.sleep(500);
input.sendKeys("教程");
//ctrl+a 全选输入框内容
Thread.sleep(500);
input.sendKeys(Keys.CONTROL,"a");
//ctrl+x 剪切输入框内容
Thread.sleep(500);
input.sendKeys(Keys.CONTROL,"x");
//ctrl+v 粘贴内容到输入框
Thread.sleep(500);
input.sendKeys(Keys.CONTROL,"v");
//通过回车键盘来代替点击操作
Thread.sleep(500);
input.sendKeys(Keys.ENTER);
Thread.sleep(500);
driver.quit();
}
}
设置元素等待
如今大多数 Web 应用程序使用 AJAX 技术。当浏览器在加载页面时,页面上的元素可能并不是同时被加载完成的,这给元素的定位增加了困难。如果因为在加载某个元素时延迟而造成元素定位失败的况,那么就会降低自动化脚本的稳定性。我们可以通过设置元素等待提高这种问题而造成的不稳定。
定位一组元素
- 区别于找到某一个元素findElement,定位一组元素只是在其后面多加了个s,用于定位一组元素:findElements
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>Checkbox</title>
<link href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet" />
<script src="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.js"></script>
</head>
<body>
<h3>checkbox</h3>
<div class="well">
<form class="form-horizontal">
<div class="control-group">
<label class="control-label" for="c1">checkbox1</label>
<div class="controls">
<input type="checkbox" id="c1" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="c2">checkbox2</label>
<div class="controls">
<input type="checkbox" id="c2" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="c3">checkbox3</label>
<div class="controls">
<input type="checkbox" id="c3" />
</div>
</div>
</form>
</div>
</body>
</html>
public class checkbox {
public static void main(String[] args) throws InterruptedException {
System.setProperty("webdriver.chrome.driver", "D:/Solfware/Selenium/ChromeDriver/chromedriver.exe");
File file = new File("D:/Workspace/IdeaWorkSpace/Selenium/src/main/resources/checkbox.html");
String absolutePath = file.getAbsolutePath();
WebDriver driver = new ChromeDriver();
driver.get(absolutePath);
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
//findElements找到一组元素,通过xpath找到该组别元素
List<WebElement> elements = driver.findElements(By.xpath("//input[@type='checkbox']"));
for (WebElement element : elements) {
// String type = new String(element.getAttribute("type"));
// if (type.equals("checkbox")){
// element.click();
// Thread.sleep(2000);
// }
System.out.println("这是"+element+"checkbox");
element.click();
Thread.sleep(1000);
}
//获取最后一个元素并进行点击事件
elements.get(elements.size()-1).click();
Thread.sleep(1000);
driver.close();
}
}
frame切换
- 对于通过iframe表单嵌入页面的,我们无法直接通过findElement定位找到该元素。我们必须通过
driver.switchTo().frame();
切换到该iframe后,方可继续定位并测试,如:
<html>
<head>
<link href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet" />
<script type="text/javascript">$(document).ready(function(){
});
</script>
</head>
<body>
<div class="row-fluid">
<div class="span10 well">
<h3>frame</h3>
<iframe id="if" name="nf" src="http://www.baidu.com" width="800" height="300">
</iframe>
</div>
</div>
</body>
<script
src="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.js"></script>
</html>
public class Frame {
public static void main(String[] args) throws InterruptedException {
WebDriver driver = new ChromeDriver();
File file = new File("E:/jase/frame.html");
String filePath = file.getAbsolutePath();
driver.get(filePath);
//切换到 iframe(id = "if")
driver.switchTo().frame("if");
driver.findElement(By.id("kw")).sendKeys("webdriver");
driver.findElement(By.id("su")).click();
Thread.sleep(5000);
driver.quit();
}
}
多窗口切换
- 在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要主机切换到新打开的窗口上进行操作。WebDriver 提供了 switchTo().window()方法可以实现在不同的窗口之间切换。
class Windows {
public static void main(String[] arge) throws InterruptedException{
System.setProperty("webdriver.chrome.driver", "D:/Solfware/Selenium/ChromeDriver/chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://www.baidu.com");
//获得当前窗口句柄,即找到当前的窗口
String sreach_handle = driver.getWindowHandle();
//打开百度注册窗口
System.out.println(sreach_handle);
driver.findElement(By.linkText("登录")).click();
Thread.sleep(3000);
driver.findElement(By.linkText("立即注册")).click();
//获得所有窗口句柄,即找到所有的窗口
Set<String> handles = driver.getWindowHandles();
//判断是否为注册窗口,并操作注册窗口上的元素
for(String handle : handles){
if (handle.equals(sreach_handle)==false){
//切换到注册页面
driver.switchTo().window(handle);
System.out.println("now register window!");
Thread.sleep(2000);
driver.findElement(By.xpath("//input[@id='TANGRAM__PSP_4__userName']")).clear();
driver.findElement(By.xpath("//input[@id='TANGRAM__PSP_4__userName']")).sendKeys("username");
driver.findElement(By.xpath("//input[@id='TANGRAM__PSP_4__password']")).clear();
driver.findElement(By.xpath("//input[@id='TANGRAM__PSP_4__password']")).sendKeys("password");
Thread.sleep(2000);
//关闭当前窗口
driver.close();
}
}
//判断是否为百度首页,并操作首页上的元素
for(String handle : handles){
if (handle.equals(sreach_handle)){
//切换到注册页面
driver.switchTo().window(handle);
Thread.sleep(2000);
driver.findElement(By.className("close-btn")).click();
System.out.println("now baidu sreach page!");
driver.findElement(By.id("kw")).sendKeys("webdriver");
driver.findElement(By.id("su")).click();
Thread.sleep(2000);
}
}
driver.quit();
}
}
提示框的处理
- 一些网页、系统的一些操作提示框是无法被定位的,我们可以通过
switch_to_alert()
方法去操作提示框。 - getText():返回 alert/confirm/prompt 中的文字信息。
- accept(): 接受现有警告框。
- dismiss():解散现有警告框。
- sendKeys(keysToSend): 发送文本至警告框。keysToSend:将文本发送至警告框。
class Alert {
public static void main(String[] args) throws InterruptedException{
System.setProperty("webdriver.chrome.driver", "D:/Solfware/Selenium/ChromeDriver/chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://www.baidu.com");
// 与浏览器同步非常重要,必须等待浏览器加载完毕
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//鼠标悬停相“设置”链接
Actions action = new Actions(driver);
action.clickAndHold(driver.findElement(By.id("s-usersetting-top"))).perform();
//打开搜索设置
driver.findElement(By.xpath("//a[contains(text(),'搜索设置')]")).click();
Thread.sleep(2000);
//保存设置
driver.findElement(By.xpath("//a[contains(text(),'保存设置')]")).click();
Thread.sleep(2000);
//接收弹窗
System.out.println("弹窗为:"+driver.switchTo().alert().getText());
driver.switchTo().alert().accept();
driver.quit();
}
}
操作cookie
public class CookieOpe {
public static void main(String[] args){
WebDriver driver = new ChromeDriver();
driver.get("http://www.youdao.com");
//定义cookie字典
Cookie c1 = new Cookie("name", "key-aaaaaaa");
Cookie c2 = new Cookie("value", "value-bbbbbb");
//添加cookie
driver.manage().addCookie(c1);
driver.manage().addCookie(c2);
//获得 cookie
Set<Cookie> coo = driver.manage().getCookies();
//打印 cookie
System.out.println(coo);
//删除所有 cookie
//driver.manage().deleteAllCookies();
driver.quit();
}
}
操作JavaScript
- 通过
((JavascriptExecutor)driver).executeScript(“your JavaScript code”)
执行JavaScript代码。
class JS {
public static void main(String[] args) throws InterruptedException{
WebDriver driver = new ChromeDriver();
driver.manage().window().setSize(new Dimension(700, 600));
driver.get("http://www.baidu.com");
driver.findElement(By.id("kw")).sendKeys("webdriver api");
driver.findElement(By.id("su")).click();
Thread.sleep(2000);
//将页面滚动条拖到底部
((JavascriptExecutor)driver).executeScript("window.scrollTo(100,450);");
Thread.sleep(3000);
System.out.println("end");
driver.quit();
}
}
截图
public class Baidu {
public static void main(String[] args){
WebDriver driver = new ChromeDriver();
driver.get("http://www.baidu.com");
try {
File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
//图片的名字可以通过具体时间戳进行命名
FileUtils.copyFile(srcFile,new File("d:\screenshot.png"));
} catch (Exception e) {
e.printStackTrace();
}
driver.quit();
}
}
Selenium Chrome IDE下载
Selenium Chrome IDE
Selenium Chrome IDE入门案例
- 基本界面展示
- 简单说明:type用于设置字段输入的值,target表明找到id=kw的这个标签,value是输入的值。pause用于暂停,相当于java中的Thread.sleep。assert 为断言,只有符合条件的时候才为true。否则log日志输出错误。更多详细的api文档请参考:Selenium IDE API
testNg的安装与使用
- 使用maven导入testNg的坐标依赖
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>compile</scope>
</dependency>
- 通过xml方式/直接启动的方式,启动测试
- 直接启动的方式:
public class testNg {
private WebDriver driver;
private String baseUrl;
/**
* 被注释的方法将在当前类的第一个测试方法(@Test)调用前运行。
* */
@BeforeClass
public void setUp() throws Exception {
System.setProperty("webdriver.chrome.driver", "D:/Solfware/Selenium/ChromeDriver/chromedriver.exe");
driver = new ChromeDriver();
baseUrl = "https://www.baidu.com/";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@Test
public void testCase() throws Exception {
driver.get(baseUrl + "/");
driver.findElement(By.id("kw")).sendKeys("testNG");
driver.findElement(By.id("su")).click();
Thread.sleep(2000);
String title =driver.getTitle();
assertEquals(title,"testNG_百度搜索");
}
@AfterClass
public void tearDown() throws Exception {
driver.quit();
}
}
- 通过xml配置的方式,运行xml来启动测试:
按类名类进行测试
<suite name="suite1">
<!--verbose的意思表示的是日志输出的级别,0-10,数字越大越详细。name表示的是这个test的名字-->
<test verbose="2" name="test1">
<!--classes为类,旗下可以包含许多要测试的类。class name=“全路径类名”-->
<classes>
<class name="ng.testNg"></class>
</classes>
</test>
<test verbose="2" name="test2">
<classes>
<class name="ng.testNg3">
<!--这里可以通过include,exclude指定该类的那些方法需要被测试,那些方法不需要被测试。
如果不指定,则该类全部进行测试。
-->
<!--<methods>
<include name="setUp" />
<include name="test" />
<include name="tearDown" />
</methods>
-->
</class>
<class name="ng.testNg2"></class>
</classes>
</test>
</suite>
按包名来进行测试
<suite name="suite1">
<test name="Regression1" >
<packages>
<!--package name为需要测试的类所在的包-->
<package name="ng" />
</packages>
</test>
</suite>
自定义分组进行测试
- 最后,在此补充更多的testng.xml相关参数的信息,详细请参考testng.xml 配置大全
testNg依赖测试
public class testMail {
public static WebDriver driver;
/**
* 登陆测试
* */
public static void login(WebDriver driver, String username, String pwd) throws InterruptedException {
String first_handle = driver.getWindowHandle();
System.out.println("登陆的窗口为"+first_handle);
driver.findElement(By.id("u")).clear();
driver.findElement(By.id("u")).sendKeys(username);
Thread.sleep(1000);
driver.findElement(By.xpath("//input[@id='p']")).clear();
driver.findElement(By.xpath("//input[@id='p']")).sendKeys(pwd);
driver.findElement(By.id("login_button")).click();
Thread.sleep(3000);
String second_handle = driver.getWindowHandle();
System.out.println("登陆后的窗口为:"+second_handle);
String uname = driver.findElement(By.xpath("//span[@id='useraddr']")).getText();
System.out.println("登陆的用户为:"+uname);
}
public static void logout(WebDriver driver){
driver.findElement(By.xpath("//a[contains(text(),'退出')]")).click();
}
@Test
public void verifyLogin() throws InterruptedException {
System.setProperty("webdriver.chrome.driver", "D:/Solfware/Selenium/ChromeDriver/chromedriver.exe");
driver = new ChromeDriver();
driver.get("https://wx.mail.qq.com/");
driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
String username = "你的qq号";
String password = "你的qq密码";
driver.findElement(By.xpath("//div[contains(text(),'QQ登录')]")).click();
driver.switchTo().frame(driver.findElement(By.xpath("//body/div[1]/div[2]/div[1]/div[1]/div[1]/div[2]/div[2]/iframe[1]")));
login(driver,username,password);
String text = driver.findElement(By.id("useraddr")).getText();
assertEquals(text,"你的qq号@qq.com");
// logout(driver);
// driver.quit();
}
/**
* 查找测试,基于登陆的基础之上
* */
@Test(dependsOnMethods = {"verifyLogin"})
public void search() throws InterruptedException {
System.setProperty("webdriver.chrome.driver", "D:/Solfware/Selenium/ChromeDriver/chromedriver.exe");
System.out.println("search:");
driver.findElement(By.xpath("//a[contains(text(),'通讯录')]")).click();
driver.switchTo().frame(driver.findElement(By.xpath(" //iframe[@id='mainFrame']")));
Thread.sleep(1000);
driver.findElement(By.xpath("//input[@id='keyword']")).sendKeys("b");
driver.findElement(By.xpath("//body/div[@id='out']/div[@id='bar']/div[1]/div[1]/div[1]/form[1]/a[1]")).click();
}
}
- 在这个案例里面,通过dependsOnMethods实现第二个测试依赖于第一个测试,第一个测试如果不通过则不会进行第二个测试。并且通过static的方式使得webdriver全局唯一,保证了两个测试在同一个窗口进行。但是真实的情况下默认一个自动测试用例使用一个driver,即一个测试用例都是一个闭合的业务操作,用例与用例之间相互独立。
testNg忽略测试
- 对于还没准备好的测试用例,但是由于进度要求不得不对其他用例进行测试。可以通过在对应的方法上添加注解
@Test(enabled = false)
来暂时忽略该用例测试。
testNg参数化测试(DataProvider)
- 在testNg中通过
Object[][]
二维数组存放数据,并用@DataProvider(name="")
声明该自定义参数的名字,key和value。具体的示例如下:
public class paramMail {
public static WebDriver driver;
//定义对象数组,testNg中只能通过Object[][]自定义参数
@DataProvider(name="user")
public Object[][] Users(){
return new Object[][]{
{"qq号","密码"},
};
}
//调用
public static void login(WebDriver driver, String username, String pwd) throws InterruptedException {
String first_handle = driver.getWindowHandle();
System.out.println("登陆的窗口为"+first_handle);
driver.findElement(By.id("u")).clear();
driver.findElement(By.id("u")).sendKeys(username);
Thread.sleep(1000);
driver.findElement(By.xpath("//input[@id='p']")).clear();
driver.findElement(By.xpath("//input[@id='p']")).sendKeys(pwd);
driver.findElement(By.id("login_button")).click();
Thread.sleep(3000);
String second_handle = driver.getWindowHandle();
System.out.println("登陆后的窗口为:"+second_handle);
String uname = driver.findElement(By.xpath("//span[@id='useraddr']")).getText();
System.out.println("登陆的用户为:"+uname);
}
//指定所用的数据集
@Test(dataProvider = "user")
public void verifyLogin(String username,String password) throws InterruptedException {
System.setProperty("webdriver.chrome.driver", "D:/Solfware/Selenium/ChromeDriver/chromedriver.exe");
driver = new ChromeDriver();
driver.get("https://wx.mail.qq.com/");
driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
driver.findElement(By.xpath("//div[contains(text(),'QQ登录')]")).click();
driver.switchTo().frame(driver.findElement(By.xpath("//body/div[1]/div[2]/div[1]/div[1]/div[1]/div[2]/div[2]/iframe[1]")));
login(driver,username,password);
String text = driver.findElement(By.id("useraddr")).getText();
assertEquals(text,"qq号@qq.com");
// logout(driver);
// driver.quit();
}
}
testNg参数化测试(xml)
- 通过在xml中配置参数的方式,提供给测试方法使用。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="mail">
<parameter name="param1" value="param1"></parameter>
<test verbose="5" name="testMail">
<parameter name="param2" value="param2"></parameter>
<parameter name="param3" value="param3"></parameter>
<classes>
<class name="testParam.paramXml"/>
</classes>
</test>
</suite>
public class paramXml {
public static WebDriver webDriver;
@BeforeTest
public void setUp(){
System.setProperty("webdriver.chrome.driver", "D:/Solfware/Selenium/ChromeDriver/chromedriver.exe");
webDriver = new ChromeDriver();
webDriver.manage().window().maximize();
}
/**
* 给定的参数会按顺序依次在下面的方法进行使用,即:parma3-String param2,param2-String param3,按顺序进行赋值
* */
@Test
@Parameters({"param3","param2"})
public void test(String param2,String param3) throws InterruptedException {
webDriver.get("http://www.baidu.com");
webDriver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
webDriver.findElement(By.id("kw")).sendKeys(param2);
webDriver.findElement(By.id("su")).click();
Thread.sleep(3000);
System.out.println("param3:"+param3);
}
}
1 .变量的取值是按照testng.xml中定义的顺序来取值的
2.<parameter>
可以声明在<suite>
或者<test>
级别,在<test>
下的<parameter>
会覆盖在<suite>
下声明的同名变量
testNg超时测试
class Timeout {
//超时时间位5秒
@Test(timeOut = 5000)
public void ok() throws InterruptedException {
Thread.sleep(4000);
System.out.println("ok");
}
@Test(timeOut = 1000)
public void fail() throws InterruptedException {
Thread.sleep(3000);
}
}
Selenium Grid安装及使用
- 第一步,下载selenium server,下载地址
- 第二步,解压jar到指定目录
- 第三步,在该目录的文件路径输入cmd,启动命令符
- 第四步,配置-hub主节点以及-node子节点
踩坑注意!
如果不是将chrome/firefox浏览器默认安装在其安装盘的,需要在启动selenium grid server的时候,把对应的浏览器驱动加上,不然就会报错,详细错误为:
Error forwarding the new session Empty pool of VM for setup Capabilities
Caused by: org.openqa.selenium.SessionNotCreatedException: Unable to create new service: ChromeDriverService
- 具体的配置以及参考说明如下:
//node子节点
//-Dwebdriver.chrome.driver 指定浏览器的驱动(关键)
java -Dwebdriver.chrome.driver="D:SolfwareSeleniumChromeDriverchromedriver.exe" -jar selenium-server-standalone-3.141.59.jar -role node -port 5555 -hub http://你的主节点ip:4444/grid/register/
//hub主节点
//-jar 启动jar包 -role 指定是主节点还是子节点 -port 指定端口号,默认是4444
java -jar selenium-server-standalone-3.141.59.jar -role hub -port 4444
- 第五步,在IDEA中导入selenium grid的坐标
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>3.141.59</version>
</dependency>
- 第六步,编写测试用例
public class seRc {
public static void main(String[] args) throws Exception {
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setPlatform(Platform.WINDOWS);
capabilities.setBrowserName("chrome");
capabilities.setJavascriptEnabled(true);
WebDriver driver;
try {
driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capabilities);
driver.get("https://www.baidu.com");
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
多浏览器多节点单线程执行用例
- 旨在编写一个用例,从而达到一个用例可以多个浏览器执行的方法。因为以前的web driver只能针对一个浏览器去进行测试。
- 涉及到的浏览器有:Chrome、IE
- 第一步:当然是把浏览器的对应driver下载下来。Chrome的driver根据其浏览器的版本进行下载,IE的driver根据你的selenium gird的版本进行下载。
- 第二步:通过cmd命令行,启动主节点以及子节点。需要用到什么浏览器就启动什么浏览器的子节点,例如:
#启动主节点
D:SolfwareSeleniumChromeSeleniumGrid>java -jar selenium-server-standalone-3.141.59.jar -role hub -port 4444
#启动谷歌浏览器节点
D:SolfwareSeleniumChromeSeleniumGrid>java -Dwebdriver.chrome.driver="D:SolfwareSeleniumChromeDriverchromedriver.exe" -jar selenium-server-standalone-3.141.59.jar -role node -port 5555 -hub http://主节点ip:4444/grid/register/
#启动IE浏览器节点
D:SolfwareSeleniumChromeSeleniumGrid>java -Dwebdriver.ie.driver="D:SolfwareSeleniumChromeDriverIEDriverServer.exe" -jar selenium-server-standalone-3.141.59.jar -role node -port 6666 -hub http://主节点ip:4444/grid/register/
- 依次类推,需要启动什么浏览器,只需要找到其对应的driver,启动其子节点即可。
- 第三步,通过Eclispe/IDEA编写脚本,示例参考如下:
#定义一个公用接口,使用java策略模式根据浏览器的选择动态返回需要的browser
@Service("IBrowser")
public interface IBrowser {
DesiredCapabilities browser();
}
#策略一,使用谷歌浏览器登陆
@Service("chrome")
public class ChromeImpl implements IBrowser{
public static final DesiredCapabilities desiredCapabilities = DesiredCapabilities.chrome();
public static final String ip = "http://192.168.107.1:5555/wd/hub";
@Override
public Map<String, Object> info() {
Map<String,Object> map = new HashMap<>();
map.put("ip",ip);
map.put("driver",desiredCapabilities);
return map;
}
}
#策略二,使用ie浏览器登陆
@Service("ie")
public class IEImpl implements IBrowser{
public static final DesiredCapabilities desiredCapabilities = DesiredCapabilities.internetExplorer();
public static final String ip = "http://192.168.107.1:6666/wd/hub";
@Override
public Map<String, Object> info() {
Map<String,Object> map = new HashMap<>();
map.put("ip",ip);
map.put("driver",desiredCapabilities);
return map;
}
}
#策略三,使用firefox浏览器登陆(此处仅提供策略,我没有下firefox)
@Service("ff")
public class FFImpl implements IBrowser{
public static final DesiredCapabilities desiredCapabilities = DesiredCapabilities.firefox();
public static final String ip = "http://192.168.107.1:7777/wd/hub";
@Override
public Map<String, Object> info() {
Map<String,Object> map = new HashMap<>();
map.put("ip",ip);
map.put("driver",desiredCapabilities);
return map;
}
}
@Service("webFactory")
public class webFactory {
public Map<String,Object> produce(String name){
if(name.equals("chrome")){
return new ChromeImpl().info();
}
if(name.equals("ff")){
return new FFImpl().info();
}
if(name.equals("ie")){
return new IEImpl().info();
}
else {
System.out.println("浏览器类型暂不支持,仅支持IE,FireFox,Chrome浏览器");
return null;
}
}
}
#编写测试用例脚本
public class test {
public static DesiredCapabilities drivers;
public static String ip;
public void runBaiduTest(WebDriver driver){
driver.manage().window().maximize();
driver.get("https://www.baidu.com");
driver.findElement(By.id("kw")).sendKeys("selenium");
System.out.println("test方法里面:"+driver.getWindowHandle());
driver.findElement(By.id("su")).click();
driver.quit();
}
@Test
public void main() throws MalformedURLException {
String browsers[] =new String[]{"chrome","ie"};
for (int i = 0; i < browsers.length; i++) {
// 根据浏览器类型获取对应的策略 bean
webFactory factory = new webFactory();
Map<String, Object> produce = factory.produce(browsers[i]);
if(!produce.isEmpty()){
drivers = (DesiredCapabilities) produce.get("driver");
ip = (String) produce.get("ip");
System.out.println(drivers.getBrowserName());
drivers.setPlatform(Platform.WINDOWS);
drivers.setJavascriptEnabled(true);
WebDriver driver = new RemoteWebDriver(new URL(ip),drivers);
System.out.println("driver:"+driver);
runBaiduTest(driver);
}
else{
System.out.println("ERROE!");
}
}
}
}
注意!在使用IE浏览器进行自动化测试的时候,可能会出现IE浏览器不受selenium控制的情况。此时我们需要打开IE浏览器,打开IE——》设置——》Internet选项——》安全——》去掉4个所有的启用保护模式前的对勾。同时,我们要在打开页面之前,设置网站全屏打开。不然IE浏览器可能就不会被我们的selenium进行识别控制。详细请参考:[128]selenium WebDriver使用IE浏览器。
多浏览器多节点多线程执行用例
#执行脚本
public class MultiThread {
private WebDriver dr;
DesiredCapabilities test;
String baseUrl;
@Parameters({"browser","nodeUrl","webSite"})
@BeforeMethod
public void setUp(String browser,String nodeUrl,String webSite){
baseUrl = webSite;
if(browser.equals("ie")) test =
DesiredCapabilities.internetExplorer();
else if(browser.equals("chrome")) test = DesiredCapabilities.chrome();
else System.out.println("browser 参数有误,只能为 ie、 ff、chrome");
String url = nodeUrl + "/wd/hub";
URL urlInstance = null;
try {
urlInstance = new URL(url);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("实例化 url 出错,检查一下 url 格式是否正确,格式为 http://127.0.0.1:4444");
}
dr = new RemoteWebDriver(urlInstance,test);
//dr.get(webSite);
}
@Test
public void test(){
dr.manage().window().maximize();
dr.get(baseUrl);
dr.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
dr.findElement(By.id("kw")).sendKeys("selenium");
dr.findElement(By.id("su")).click();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("title:"+dr.getTitle());
}
@AfterMethod
public void quit(){
dr.close();
}
}
<!--
parallel是否在不同的线程并行进行测试,要与thread-count配套使用,默认为false,threadcount为并行的线程数
-->
<suite name="Suite1" parallel="tests" thread-count="3">
<!-- 可以在这里理解为一个test就是一个线程,一次测试用例 -->
<test name="test2">
<parameter name="browser" value="chrome"/>
<parameter name="nodeUrl" value="http://192.168.107.1:5555"/>
<parameter name="webSite" value="http://www.baidu.com"/>
<classes> <class name="Grid.Thread.MultiThread"></class>
</classes>
</test>
<test name="test3">
<parameter name="browser" value="ie"/>
<parameter name="nodeUrl" value="http://192.168.107.1:6666"/>
<parameter name="webSite" value="http://www.baidu.com"/>
<classes> <class name="Grid.Thread.MultiThread"></class>
</classes>
</test>
</suite>
最后
以上就是帅气小天鹅为你收集整理的软件测试之自动化测试Selenium-java入门Selenium自动化测试实战PDFSelenium在Java下的安装与使用常见的定位元素Selenium的一些基本用法鼠标事件键盘事件keys设置元素等待定位一组元素frame切换多窗口切换提示框的处理操作cookie操作JavaScript截图Selenium Chrome IDE下载Selenium Chrome IDE入门案例testNg的安装与使用testNg依赖测试testNg忽略测试testNg参数化测试(DataProvider)的全部内容,希望文章能够帮你解决软件测试之自动化测试Selenium-java入门Selenium自动化测试实战PDFSelenium在Java下的安装与使用常见的定位元素Selenium的一些基本用法鼠标事件键盘事件keys设置元素等待定位一组元素frame切换多窗口切换提示框的处理操作cookie操作JavaScript截图Selenium Chrome IDE下载Selenium Chrome IDE入门案例testNg的安装与使用testNg依赖测试testNg忽略测试testNg参数化测试(DataProvider)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复