软件测试之自动化测试Selenium-java入门

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依赖测试

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:\Solfware\Selenium\ChromeDriver\chromedriver.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:\Solfware\Selenium\ChromeSeleniumGrid>java -jar selenium-server-standalone-3.141.59.jar -role hub -port 4444
#启动谷歌浏览器节点
D:\Solfware\Selenium\ChromeSeleniumGrid>java -Dwebdriver.chrome.driver="D:\Solfware\Selenium\ChromeDriver\chromedriver.exe" -jar selenium-server-standalone-3.141.59.jar -role node -port 5555 -hub http://主节点ip:4444/grid/register/
#启动IE浏览器节点
D:\Solfware\Selenium\ChromeSeleniumGrid>java -Dwebdriver.ie.driver="D:\Solfware\Selenium\ChromeDriver\IEDriverServer.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>
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值