目录

身边有个做测试的人,加上自己对测试也很感兴趣,就顺便学习了一下自动化测试,使用selenium。

什么是Selenium?

Selenium (SeleniumHQ) 是 thoughtworks公司的一个集成测试的强大工具。

Selenium也是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE、Mozilla、Chrome、Safari、Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建衰退测试检验软件功能和用户需求。支持自动录制动作和自动生成。Net、Java、Python、Perl、Javascript等不同语言的测试脚本。

官网:http://www.seleniumhq.org/

你可以通过官方的IDE录制脚本,也可以选择一门语言自己编写测试脚本,我没有下载官方IDE,没了解怎么录制,所以直接用Intellij IDEA编写一个简单的demo来跑一下。

实战

新建maven项目

项目可以通过gradle或者maven进行构建,我这里选择maven吧,然后添加依赖。

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>2.53.1</version>
</dependency>
<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>6.14.3</version>
    <scope>test</scope>
</dependency>

创建Test类

@Test
    public void actions() {
        WebDriver driver = new ChromeDriver();
        driver.get("http://baidu.com");
    }

启动测试报错:

Exception in thread "main" java.lang.IllegalStateException: The path to the driver executable must be set by the webdriver.chrome.driver system property; for more information, see https://github.com/SeleniumHQ/selenium/wiki/ChromeDriver. The latest version can be downloaded from http://chromedriver.storage.googleapis.com/index.html
    at com.google.common.base.Preconditions.checkState(Preconditions.java:199)
    at org.openqa.selenium.remote.service.DriverService.findExecutable(DriverService.java:109)
    at org.openqa.selenium.chrome.ChromeDriverService.access$000(ChromeDriverService.java:32)
    at org.openqa.selenium.chrome.ChromeDriverService$Builder.findDefaultExecutable(ChromeDriverService.java:137)
    at org.openqa.selenium.remote.service.DriverService$Builder.build(DriverService.java:296)
    at org.openqa.selenium.chrome.ChromeDriverService.createDefaultService(ChromeDriverService.java:88)
    at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:116)

报错原因:没有找到chromeWebDriver,下载webDriver放到工程文件下(下载地址:https://sites.google.com/a/chromium.org/chromedriver/downloads

我们需要下载对应浏览器对应版本的driver。

chrome driver:

http://chromedriver.storage.googleapis.com/index.html notes.txt中有版本信息

https://npm.taobao.org/mirrors/chromedriver/ 阿里云镜像

firefox driver:

https://github.com/mozilla/geckodriver

初次接触Selenium自动化测试

driver下载后放在任意目录,然后在代码中配置driver路径

@Test
    public void actions() {
        //配置driver路径,绝对相对路径都可以
        System.setProperty("webdriver.chrome.driver", "drivers\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        //System.setProperty("webdriver.gecko.driver", "drivers\\geckodriver.exe");
        //WebDriver driver = new FirefoxDriver();
        WebDriver driver = new ChromeDriver();
        driver.get("http://baidu.com");
    }

重新执行;启动后报错如下:

Starting ChromeDriver 2.22.397933 (1cab651507b88dec79b2b2a22d1943c01833cc1b) on port 39480
Only local connections are allowed.
Exception in thread "main" org.openqa.selenium.SessionNotCreatedException: session not created exception
from unknown error: Runtime.executionContextCreated has invalid 'context': {"auxData":{"frameId":"103372.1","isDefault":true},"id":1,"name":"","origin":"://"}
  (Session info: chrome=59.0.3071.115)
  (Driver info: chromedriver=2.22.397933 (1cab651507b88dec79b2b2a22d1943c01833cc1b),platform=Windows NT 6.1.7601 SP1 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 3.83 seconds
Build info: version: '2.53.1', revision: 'a36b8b1cd5757287168e54b817830adce9b0158d', time: '2016-06-30 19:26:09'
System info: host: 'PAFSH-D0564', ip: '10.28.81.85', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.7.0_80'
Driver info: org.openqa.selenium.chrome.ChromeDriver
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:678)
    at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:249)
    at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:131)
    at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:144)
    at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:170)
    at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:159)
    at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:116)

报错原因:webDriver和chrome版本不匹配;报错session不能创建一般都是这个原因;找到匹配版本替换webdriver。

重新执行;执行成功;

优化代码

依赖引入:

<dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>2.53.1</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-firefox-driver</artifactId>
            <version>3.11.0</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-chrome-driver</artifactId>
            <version>3.11.0</version>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.14.3</version>
            <scope>test</scope>
        </dependency>

完整代码:

public class Demo1 {
    @BeforeClass
    public void beforeAction() {
        System.out.println("用例前执行打印本句!");
        System.out.println("每条Test用例是互不相干的");
        System.out.println("用例开始执行…………");
    }

    @AfterClass
    public void afterAction(){
        System.out.println("用例结束后运行");
    }

    @Test
    public void actions() {
        //chrome driver
        System.setProperty("webdriver.chrome.driver", "drivers\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        //firefox driver
        //System.setProperty("webdriver.gecko.driver", "drivers\\geckodriver.exe");
        //WebDriver driver = new FirefoxDriver();
        driver.get("http://baidu.com");
        try {
            //页面等待
            Thread.sleep(3000);
            //定位输入框元素
            WebElement kwInput = driver.findElement(By.id("kw"));
            //在输入框输入文本
            kwInput.sendKeys("小米笔记");
            //定位按钮元素
            WebElement searchBtn = driver.findElement(By.id("su"));
            //点击按钮
            searchBtn.click();
            //页面等待
            Thread.sleep(3000);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //关闭驱动
            driver.close();
        }
    }
}

执行后会自动弹出浏览器,浏览器也会自动操作,完成用例。

初次接触Selenium自动化测试

还写了个测试登录的demo

public class Demo2 {
    @BeforeClass
    public void beforeClass() {
        System.out.println("用例前执行打印本句!");
        System.out.println("每条Test用例是互不相干的");
        System.out.println("用例开始执行…………");
    }

    @AfterClass
    public void afterClass(){
        System.out.println("用例结束后运行");
    }
    @Test
    public void actions() {
        System.setProperty("webdriver.chrome.driver", "drivers\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        //System.setProperty("webdriver.gecko.driver", "drivers\\geckodriver.exe");
        //WebDriver driver = new FirefoxDriver();
        //打开禅道界面
        driver.get("http://www.zentao.net/user-login.html");
        //以下元素使用css格式 -cssSelector
        //输入账号
        driver.findElement(By.cssSelector("#account")).sendKeys("Flicker");
        //输入密码
        driver.findElement(By.cssSelector("#password")).sendKeys("12345678910");
        //点击登录
        driver.findElement(By.cssSelector("#submit")).click();
        try {
            //页面等待
            Thread.sleep(3000);
            //抓取成功登录后的用户名信息
            String text = driver.findElement(By.cssSelector("#siteNav > a:nth-child(4)")).getText();
            //断言-校验是否登录成功
            Assert.assertEquals(text,"张三");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //关闭浏览器进程及驱动
        driver.close();
    }
}

遇到的坑

  1. 下载的driver一定要和版本对应

  2. 浏览器官方都推荐安装到默认路径,不然可能出现运行后地址栏只有data:,,不会执行操作,亲测大坑,只有重装浏览器到默认路径。

  3. 不要瞎JB安装插件,我之前在chrome上安装了一个浏览器增强插件:GreenChrome,导致浏览器不自动操作。

Github

https://github.com/FlickerMi/selenium-demo

参考资料