【自动化测试】Selenium自动化测试框架 | 相关介绍 | Selenium + Java环境搭建 | 常用API的使用

文章目录

自动化测试

  • 单元测试、接口测试、UI自动化测试...

一、selenium

  • 是自动化测试框架
1.相关介绍
  • Selenium是web应用中基于UI的自动化测试框架,支持多平台、多浏览器、多语言。
  • 由Selenium IDE, Webdriver,Selenium Grid组成
1.Selenium IDE

​ Selenium IDE一个用于Selenium测试的完成集成开发环境,可以直接录制在浏览器的用户操作,并且 能回放,编辑和调试测试脚本。调试过程中可以逐步进行或调整执行的速度,并且可以在底部浏览日志出错信息。 录制的测试脚本可以以多种语言导出,比如java,C#,Python,Ruby等,方便掌握不同语言的测试人员操作。

2.Webdriver

​ Selenium RC 在浏览器中运行 JavaScript 应用,会存在环境沙箱问题,而WebDriver可以跳出 JavaScript的沙箱,针对不同的浏览器创建更健壮的,分布式的,跨平台的自动化测试脚本。基于特定语言(Java,C#,Python,Ruby,Perl,JavaScript等)绑定来驱动浏览器对Web元素进行操作和验证。

webdriver的工作原理:

​ 启动浏览器后,selenium-webdriver会将目标浏览器绑定到特定的端口,启动后的浏览器则作为 webdriver的remote server。 客户端(也就是测试脚本),借助ComandExecutor发送HTTP请求给sever端(通信协议:The WebDriver Wire Protocol,在HTTP request的body中,会以WebDriver Wire协议规定的JSON格 式的字符串来告诉Selenium我们希望浏览器接下来做什么事情)。 Sever端需要依赖原生的浏览器组件,转化Web Service的命令为浏览器native的调用来完成操 作。

3.selenium Grid

​ selenium Grid是一个服务器,提供对浏览器实例访问的服务器列表,管理各个节点的注册和状态信息。可以实现在同一时刻不同服务器上执行不同的测试脚本。

2.Selenium + Java环境搭建

下载浏览器驱动

xml 复制代码
    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.141.59</version>
        </dependency>

    </dependencies>

引入依赖

java 复制代码
    public static void main(String[] args) {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
    }

测试能否正确运行

3.常用API的使用
1.定位元素

findElement()

类选择器定位、xpath定位

java 复制代码
    public static void main(String[] args) {
        ChromeOptions options = new ChromeOptions();
        //创建一个选项对象
        options.addArguments("--remote-allow-origins=*");
        //添加参数,允许访问所有的页面
        WebDriver webDriver = new ChromeDriver(options);
        //打开百度
        webDriver.get("https://www.baidu.com");


        //找到百度搜索输入框
       // WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));
        //类选择器定位

        WebElement element = webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));
        //XPath定位

        element.sendKeys("软件测试");
    }

CSS选择语法

id选择器

java 复制代码
        WebElement element = webDriver.findElement(By.cssSelector("#kw"));
        //id选择器

类选择器

java 复制代码
        WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));
        //类选择器定位

xpath定位

1.绝对路径:以/html开头(/html/head/title)不常用

2.相对路径://开头

相对路径+索引: //form[1]/span[1]/input

 //form[1]/span[1]/input
 //form[1]/span[2]/input

相对路径+属性值

 //input[@class="s_ipt"]
 //input[@value="百度一下"]
 //input[@id="su"]

相对路径+通配符

 //*[@*="su"]

相对路径+ 文本匹配

//a[text()="文库"]

进行校验

java 复制代码
        WebElement element = webDriver.findElement(By.cssSelector("#kw"));
        //id选择器

        element.sendKeys("软件测试");
        //输入软件测试

        webDriver.findElement(By.cssSelector("#su")).click();
        //找到百度一下按钮,进行点击

        sleep(3000);
        //校验
        //1.找到搜索结果

        List<WebElement> elements = webDriver.findElements(By.cssSelector("a em"));
        for (int i = 0;i<elements.size();i++){
            System.out.println(elements.get(i).getText());
            if (elements.get(i).getText().contains("测试")){
                flag = 1;
                System.out.println("测试通过");
                break;
            }
        }
        if (flag == 0){
            System.out.println("测试不通过");
        }
  • CSS选择器定位元素效率更高
2.操作测试对象

click点击对象

send_keys在对象上模拟按键输入

clear清除对象输入的文本内容

submit 提交

text 用于获取元素的文本信息

getAttribute 获取元素对应属性的值

java 复制代码
    private static void test02() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        //添加参数,允许访问所有的页面
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        sleep(3000);
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("翁佳明java");
        //找到输入框进行搜索
        webDriver.findElement(By.cssSelector("#su")).click();
        //点击按钮
        sleep(3000);

        webDriver.findElement(By.cssSelector("#kw")).clear();
        //清空输入框中的数据

    }
  • 如果点击的元素放在form标签中,submit和click的效果是一样的。如果点击元素放在非form标签中,此时使用submit会报错。
java 复制代码
//        webDriver.findElement(By.xpath("//a[text()=\"新闻\"]")).click();
        webDriver.findElement(By.xpath("//a[text()=\"新闻\"]")).submit();
        //会出现报错

getAttribute 获取元素对应属性的值

java 复制代码
        String buttonValue = webDriver.findElement(By.cssSelector("#su")).getText();
        System.out.println(buttonValue);
        //获取不到属性值,所以用getAttribute获取属性的值
        System.out.println(webDriver.findElement(By.cssSelector("#su")).getAttribute("value"));//百度一下
3.添加等待
  • sleep强制等待

  • 智能等待(隐式等待、显示等待)

    隐式等待:通常用于等待页面元素出现,而不是等待页面加载完成。在等待时间内不断查询是否定位到元素

    java 复制代码
            webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.HOURS);

    显示等待

    java 复制代码
            WebDriverWait wait = new WebDriverWait(webDriver,3000);
            wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#bottom_layer > div111 > p:nth-child(8) > span")));
           //没找到,报错
            wait.until(ExpectedConditions.titleIs("百度一下,你就知道"));

    隐式等待和显示等待之间的区别:

    • 隐式等待:等待加载页面上所有的元素,所有元素加载完成后,再执行后续代码。如果超过时间仍没有加载出来,就会报错。等待的是所以的元素。

    • 显示等待:设置的是等待的最长时间,只要满足了设置的条件,就可以执行后续的代码,等待的是设定的条件

4.打印信息

打印title 打印url

java 复制代码
    private static void test05() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        //添加参数,允许访问所有的页面
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        String url = webDriver.getCurrentUrl();
        String title = webDriver.getTitle();
        if (url.equals("https://www.baidu.com/") && title.equals("百度一下,你就知道")){
            System.out.println("测试通过");
        }else {
            System.out.println("测试不提供");
        }
    }
5.浏览器的操作

1.浏览器前进

2.浏览器后退

java 复制代码
    private static void test07() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("520");
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        //打开百度,搜索520
        webDriver.navigate().back();
        sleep(3000);
        //浏览器后退
        webDriver.navigate().refresh();
        sleep(3000);
        webDriver.navigate().forward();
        //浏览器前进
    }

3.浏览器滚动条操作

在console中输入

js 复制代码
document.documentElement.scrollTop=1000;
java 复制代码
        sleep(3000);
        ((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");
        //滚动:把webDriver强转成JS脚本执行JS代码

4.设置页面大小

java 复制代码
        webDriver.manage().window().maximize();//最大化
        sleep(3000);
        webDriver.manage().window().fullscreen();//全屏
        sleep(3000);
        webDriver.manage().window().setSize(new Dimension(600,1000));

5.关闭浏览器

  • quit:关闭整个浏览器、会清空缓存
  • close:关闭当前页面(get的)、不会清空缓存
java 复制代码
    private static void test10() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        sleep(3000);
//        webDriver.quit();退出整个浏览器
        webDriver.close();//关闭当前页面
    }

6.窗口切换

  • 元素默认是在get的页面当中查找元素的,如果跳转了页面,就需要进行切换
java 复制代码
    private static void test10() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        sleep(3000);
//        webDriver.quit();退出整个浏览器
//        webDriver.close();
//        webDriver.getWindowHandles();//获取所有的窗口句柄
//
//        webDriver.getWindowHandle();//获取get打开的窗口句柄
        Set<String> handles = webDriver.getWindowHandles();
        String target_handle = "";
        for (String handle:handles){
             target_handle = handle;
        }//拿到最后一个handle
        webDriver.switchTo().window(target_handle);//进行窗口切换
        sleep(3000);
        webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");
        webDriver.findElement(By.cssSelector("#s_btn_wr")).click();
6.键盘事件
java 复制代码
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("520");
        //ctrl+A
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"A");
        sleep(3000);
        //ctrl+X
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"X");
        sleep(3000);

        //ctrl+V
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"V");
        sleep(3000);
        
7.鼠标事件
java 复制代码
        //找到图片按钮
        //进行鼠标右击
        WebElement element = webDriver.findElement(By.cssSelector("#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-pic_p4Uej.s-tab-pic"));
        Actions actions = new Actions(webDriver);
        sleep(3000);
        actions.moveToElement(element).contextClick().perform();
        //没有perform就没有效果
8.定位一组元素

定位一组元素

java 复制代码
   全选复选框
       webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);     
		List<WebElement> webElements = webDriver.findElements(By.cssSelector("input"));
        for (int i = 0; i < webElements.size(); i++) {
            if (webElements.get(i).getAttribute("type").equals("checkbox")){
                webElements.get(i).click();
            }
        }
9.多层框架定位

​ 通过frame的id或者name或者frame自带的其它属性来定位框架,这里switchTo().frame把当前定位的主体切换了frame里

java 复制代码
在<iframe>中,定位不到<a>,会报错。需要进行主体的转换
        webDriver.switchTo().frame("f1");
        webDriver.findElement(By.cssSelector("body>div>div>a")).click();
    
10.下拉框处理
java 复制代码
        WebElement webElement = webDriver.findElement(By.cssSelector("#ShippingMethod"));
        Select select = new Select(webElement);
        select.selectByIndex(1);//根据从0开始的索引选择
        select.selectByValue("12.51");//根据标签的value值选择	
11.处理alert弹窗
java 复制代码
        webDriver.findElement(By.cssSelector("button")).click();
        sleep(3000);
        //alert弹窗的取消->点击按钮->在弹窗中输入"520"->alert弹窗的确认
        webDriver.switchTo().alert().dismiss();//取消
        sleep(3000);
        webDriver.findElement(By.cssSelector("button")).click();
        webDriver.switchTo().alert().sendKeys("520");
        sleep(3000);
        webDriver.switchTo().alert().accept();//确定
12.上传文件操作
java 复制代码
        webDriver.findElement(By.cssSelector("input")).sendKeys("D:\\test");
        //文件上传
13.截图

需要先添加依赖

xml 复制代码
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>
java 复制代码
    private static void test12() throws InterruptedException, IOException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("测试");
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        File screenshotAs = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);
        //进行强转,进行截图
        FileUtils.copyFile(screenshotAs,new File("D://20240606jietu.png"));
        //把文件保存到磁盘中。
    }

点击移步博客主页,欢迎光临~

相关推荐
Theodore_10222 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
冰帝海岸3 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象4 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了4 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·4 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic5 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王5 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康5 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神5 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
qq_327342736 小时前
Java实现离线身份证号码OCR识别
java·开发语言