jck28 - 小柒 - selenium - L1 用例编写

一, web 浏览器控制

  • 模拟功能测试中对浏览器的操作

1,基本操作

image

2,代码示例

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

public class BrowerTest {
    static WebDriver driver;

    @BeforeAll
    static void setupClass() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        //创建一个driver对象
        driver = new ChromeDriver(options);
    }

    @AfterAll
    static void tearDownClass() {
        driver.quit();
    }

    //打开网页
    @Test
    void getTest(){
        driver.get("https://www.ceshiren.com");
    }

    //浏览器刷新网页
    @Test
    void refreshTest() throws InterruptedException {
        //先打开网页
        driver.get("https://www.ceshiren.com");
        Thread.sleep(2000);
        //刷新
        driver.navigate().refresh();
    }

    //浏览器退回
    @Test
    void backTest() throws InterruptedException {
        //先打开测试人网页网页
        driver.get("https://www.ceshiren.com");
        //打开百度网页
        driver.get("https://www.baidu.com");
        //退回到测试人网页
        driver.navigate().back();
        Thread.sleep(2000);
    }

    //浏览器前进
    @Test
    void forwardTest() throws InterruptedException {
        //先打开测试人网页网页
        driver.get("https://www.ceshiren.com");
        //打开百度网页
        driver.get("https://www.baidu.com");
        //退回到测试人网页
        driver.navigate().back();
        //再次前进到百度网页
        driver.navigate().forward();
        Thread.sleep(2000);
    }

    //浏览器窗口最大化
    @Test
    void maximizeTest() throws InterruptedException {
        //先打开测试人网页网页
        driver.get("https://www.ceshiren.com");
        driver.manage().window().maximize();
        Thread.sleep(2000);
    }

    //浏览器窗口最小化
    @Test
    void minimizeTest() throws InterruptedException {
        //先打开测试人网页网页
        driver.get("https://www.ceshiren.com");
        driver.manage().window().minimize();
        Thread.sleep(2000);
    }
}

二, 常见控件定位方法

1, Selenium定位方式

2,常用定位方式

(1) id 定位

//通过 id 定位
    @Test
    void locatorById() throws InterruptedException {
        //打开网页
        driver.get("https://www.ceshiren.com");
        //查找logo id
        WebElement logId = driver.findElement(By.id("site-logo"));
        //操作点击logo
        logId.click();
        Thread.sleep(3000);
    }

(2)name 定位

//通过 name 定位
    @Test
    void locatorByName() throws InterruptedException {
        //打开网页
        driver.get("https://www.baidu.com");
        //查找name元素的值并点击
        driver.findElement(By.name("tj_briicon")).click();
        Thread.sleep(3000);
    }

(3) cssSelector 定位

  • 格式: driver.findElement(By.cssSelector("css表达式"));

  • css selector获取方式:

    • 复制绝对定位
    • 编写 cssSelector 表达式(后面章节详细讲解)
  • 示例: 从网页获取logo对应的cssSelector

    • 鼠标放在logo上点击右键 ,选择检查,会跳转到元素模式;在logo对应的行代码点击右键 - 选择复制 - 选择复制selector即可复制成功
  • 代码展示定位logo

 @Test
    void locatorCssSelecter() throws InterruptedException {
        //打开网页
        driver.get("https://www.ceshiren.com");
        driver.findElement(By.cssSelector("#site-logo")).click();
        Thread.sleep(3000);
    }

(4)xpath 定位

  • 格式: driver.findElement(By.xpath("xpath表达式"));

  • xpath表达式获取方式:

    • 复制绝对定位
    • 编写 xpath 表达式(后面章节详细讲解)
  • 示例:从网页获取logo图标的xpath(获取方式同cssSelector)

  • 代码展示定位logo

 @Test
    void locatorByXPath() throws InterruptedException {
        //打开网页
        driver.get("https://www.ceshiren.com");
        driver.findElement(By.xpath("//*[@id=\"site-logo\"]")).click();
        Thread.sleep(3000);
    }

(5) link 定位

  • 格式:

    • driver.findElement(By.linkText("链接的文本信息"));
  • 从网页随机获取一篇帖子的标题对应的元素

  • 代码展示定位文本元素

 @Test
    void locatorByLinkText() throws InterruptedException {
        //打开网页
        driver.get("https://ceshiren.com/tag/%E7%B2%BE%E5%8D%8E%E5%B8%96");
        driver.findElement(By.linkText("思寒漫谈测试人职业发展")).click();
        Thread.sleep(3000);
    }

三,selenium 的等待方式

(1)经典的三种等待方式

(2)三种等待方式介绍

直接等待

  • 示例:页面还未渲染完成,元素还未加载出来就进行了查询元素的操作,会导致报错

  • 在报错的元素操作之前添加等待即可解决

 @Test
    void waitSleep() throws InterruptedException {
        //页面还未渲染完成,元素还未加载出来就进行了查询元素的操作,所以会导致报错
        driver.get("https://vip.ceshiren.com/");
        //添加直接等待,使线程休眠一定时间
        Thread.sleep(3000);
        driver.findElement(By.xpath("//*[text()='个人中心']"));
    }

隐式等待

  • 问题:难以确定元素加载的具体等待时间。
  • 解决方案:针对于寻找元素的这个动作,使用隐式等待添加配置。
  • 原理:设置一个等待时间,轮询查找(默认0.5秒)元素是否出现,如果没出现就抛出异常
  • 代码示例
@Test
    void waitSleepImplicitlyWait() {
        //隐式等待,是一个全局性的配置
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(4));
        driver.get("https://vip.ceshiren.com/");
        driver.findElement(By.xpath("//*[text()='个人中心']"));
    }

显式等待

  • 问题:元素可以找到,使用点击等操作,出现报错
  • 原因:
    • 页面元素加载是异步加载过程,通常html会先加载完成,js、css其后
    • 元素存在与否是由HTML决定,元素的交互是由css或者js决定
    • 隐式等待只关注元素能不能找到,不关注元素能否点击或者进行其他的交互
  • 解决方案:使用显式等待
    • 示例: WebDriverWait(driver实例, 最长等待时间).until(结束条件);
    • 原理:在最长等待时间内,是否满足结束条件
    • 代码示例:
@Test
    void waitUntil() {
        //操作:打开页面,点击消息提示按钮
        driver.get("https://vip.ceshiren.com/#/ui_study/frame");
        //显示等待:非全局性配置
        //等待By.id("success_btn")元素为可点击的状态
        WebElement successBtn = new WebDriverWait(driver, Duration.ofSeconds(5))
                .until(ExpectedConditions.elementToBeClickable(By.id("success_btn"))
                );
        //点击对应的元素按钮
        successBtn.click();
    }

四,Selenium 常见控件交互方法

元素操作

 //输入点击清空操作
    @Test
    void inputClearClick() throws InterruptedException {
        //打开百度网页
        driver.get("https://www.baidu.com/");
        //在输入框输入霍格沃兹测试开发
        driver.findElement(By.id("kw")).sendKeys("霍格沃兹测试开发");
        Thread.sleep(2000);
        //点击百度一下按钮
        driver.findElement(By.id("su")).click();
        Thread.sleep(2000);
        //清除输入框的输入
        driver.findElement(By.id("kw")).clear();
    }

获取元素属性信息

 //获取定位元素属性信息
    @Test
    void getAttribute(){
        driver.get("https://vip.ceshiren.com/#/ui_study");
        WebElement locateId = driver.findElement(By.id("locate_id"));
        //获取定位元素的文本信息并打印
        System.out.println(locateId.getText());
        //获取元素的样式信息并打印,getAttribute需要传入元素属性的名称,才能获取对应属性的值
        System.out.println(locateId.getAttribute("style"));
    }

五,Selenium 自动化测试定位策略

1, 定位方式

image

2, 选择定位器通用原则

  • (1) 与研发约定的属性优先(class属性: [name='locate'])
  • (2)身份属性 id,name(web 定位)
  • (3) 复杂场景使用组合定位:
    • xpath,css
    • 属性动态变化(id,text)
    • 重复元素属性(id,text,class)
    • 父子定位(子定位父)
  • (4)js定位