软件测试 自动化测试selenium API

1. webdriver API

1.1 定位元素

1.1.1 CSS 选择器定位元素

CSS 选择器 就是一个语法
浏览器 (ctrl + f)可以进行选择

  • 类选择器:.class值(.s_ipt)
  • id 选择器:#id值(#kw)
  • 父类选择器 子类选择器:父类选择器表达式 子类选择器表达式
  • 标签选择器:标签名(form)

1.1.2 XPath 定位元素

XPath 是一种在XML 文档中定位元素的语言。因为HTML 可以看做XML 的一种实现,所以selenium 用户可是使用这种强大语言在web 应用中定位元素。

绝对路径:通过/开头(/html/body/div/div/div)

相对路径:通过//开头

  1. 相对路径 + 索引(//form/span [1] /input)
  2. 相对路径 + 属性值(//input[@class=“s_ipt”])
  3. 相对路径 + 通配符(//* [@ * = “s_ipt”])
  4. 相对路径 + 文本匹配( //a[text()=“新闻”])

快捷方式:

  1. 点击选择器,选中需要等位的元素
  2. 鼠标放到选中的代码区域,右击
  3. 点击copy
  4. 点击 XPath 即可复制
    在这里插入图片描述

1.1.3 标签定位元素

定位元素 API :findElement

		//定位百度搜索框 (通过css选择器定位元素)
        //WebElement search_input = webDriver.findElement(By.cssSelector(".s_ipt"));

        //通过xpath 定位元素
        //WebElement search_input = webDriver.findElement(By.xpath("//form/span[1]/input"));

        //通过标签定位元素
        WebElement search_input = webDriver.findElement(By.tagName("input"));

        if (search_input == null) {
            System.out.println("测试不通过");
        }else {
            System.out.println("测试通过");
        }

1.1.4 关闭浏览器

在这里插入图片描述

  • quit 删的会更彻底一点,会关闭 cookie (比较推荐)
  • close 就是常见的关闭界面

1.1.5 css 选择器 和 xpath 选择器之间的区别

css 选择器定位元素的效率更高

2. 操作测试对象

2.1 鼠标点击、键盘输入、获取元素文本

  • click 点击对象
  • send_keys 在对象上模拟按键输入
  • text 用于获取元素的文本信息
  • getAttribute:获取元素属性值
    其中,括号后面代表的是元素的属性,如果元素没有 value 这个属性的话,此时结果是 null
	private static void Test02() throws InterruptedException {
        //创建驱动
        WebDriver webDriver = new ChromeDriver();
        //打开百度首页
        webDriver.get("https://www.baidu.com");
        //找到搜索输入框
        WebElement search_input = webDriver.findElement(By.cssSelector("#kw"));
        //向搜索输入框输入“软件测试”
        search_input.sendKeys("软件测试");
        //找到百度一下
        WebElement baidu_button = webDriver.findElement(By.cssSelector("#su"));
        //进行点击
        baidu_button.click();
        sleep(3000);
        //找到了页面上所有的“软件测试相关的元素”
        List<WebElement> search_results = webDriver.findElements(By.cssSelector("a em"));
        //遍历 list
        for (int i = 0; i < search_results.size(); i++) {
            if (search_results.get(i).getText().equals("软件测试")) {
                System.out.println("测试通过");
            }else {
                System.out.println("测试不通过");
            }
        }
        //如果元素的文本等于软件测试,测试通过
        //否则不通过
        webDriver.quit();
    }
	private static void ReviewTest() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("互联网各大行业");
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        webDriver.findElement(By.cssSelector("#kw")).clear();
        sleep(3000);
        webDriver.findElement(By.cssSelector("#result_logo > img.index-logo-src")).click();
        sleep(3000);
        //String baidu_button_txt = webDriver.findElement(By.cssSelector("#su")).getText();
        String baidu_button_txt = webDriver.findElement(By.cssSelector("#su")).getAttribute("value");
        if (baidu_button_txt.equals("百度一下")) {
            System.out.println("测试通过");
        }else {
            System.out.println("测试不通过");
        }
        webDriver.quit();
    }

2.2 submit 提交表单

private static void FalseTest() {//这里使用 submit,会报错
        //创建驱动
        WebDriver webDriver = new ChromeDriver();
        //打开百度首页
        webDriver.get("https://baidu.com");
        //找到新闻按钮
        WebElement news_button = webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)"));
        //点击新闻
        news_button.submit();
        //退出浏览器
        webDriver.quit();
    }

    private static void TrueTest() {//这里使用 click,不会报错
        //创建驱动
        WebDriver webDriver = new ChromeDriver();
        //打开百度首页
        webDriver.get("https://baidu.com");
        //找到新闻按钮
        WebElement news_button = webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)"));
        //点击新闻
        news_button.click();
        //退出浏览器
        webDriver.quit();
    }

在这里插入图片描述


submit 和 click 之间的区别:
submit 操作的元素需要放到 form 标签中,否则会报错
click 没有这个限制

推荐使用 click

3. 添加等待

3.1 添加强制等待(sleep)

添加休眠非常简单,我们需要引入time 包,就可以在脚本中自由的添加休眠时间了,这里的休眠指固定休眠
在这里插入图片描述

3.2 添加智能等待

3.2.1 添加显示等待

private static void Test06() {
        //创建驱动
        WebDriver webDriver = new ChromeDriver();
        //打开百度首页
        webDriver.get("https://baidu.com");
        //使用一下显示等待
        WebDriverWait wait = new WebDriverWait(webDriver, 3);

		//判断是否可点击
        wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#s-top-left > a:nth-child(1)")));
        //判断元素的文本
		Boolean is_true = wait.until(ExpectedConditions.textToBe(By.cssSelector("#s-top-left > a:nth-child(1)"),"新闻"));
        if(is_true) {
            System.out.println("测试通过");
        } else {
            System.out.println("测试不通过");
        }
    }

在这里插入图片描述

3.2.2 添加隐式等待

通过添加implicitly_wait() 方法就可以方便的实现智能等待

implicitly_wait(30)的用法比time.sleep()更智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待
在这里插入图片描述

time_to_wait 设置的等待时长。

隐式地等待并非一个固定的等待时间,当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它以轮询的方式不断的判断元素是否被定位到。直到超出设置的时长


隐式等待和显示等待的区别:
显示等待书写更加复杂
显示等待的是元素

推荐使用隐式等待

4. 打印信息

4.1 获取 title

  • getTitle
private static void Test07() {
        WebDriver webDriver = new ChromeDriver();
        //打开百度首页
        webDriver.get("https://www.baidu.com");
        //获取百度页面的 title
        String title = webDriver.getTitle();
        //如果获取到的 title 等于 “百度一下,你就知道”,测试通过
        if (title.equals("百度一下,你就知道")) {
            System.out.println("测试通过");
        }else {
            //否则测试不通过
            System.out.println("测试不通过");
        }
        webDriver.quit();
    }

4.2 获取 url

  • getCurrentUrl
	private static void Test08() {
        //创建一个驱动
        WebDriver webDriver = new ChromeDriver();
        //打开百度首页
        webDriver.get("https://www.baidu.com/");
        //获取当前页面的 URL
        String url = webDriver.getCurrentUrl();
        System.out.println(url);
        //如果获取到的url=https://www.baidu.com,测试通过
        if (url.equals("https://www.baidu.com/")) {
            System.out.println("测试通过");
        }else {
            //否则测试不通过
            System.out.println("测试不通过");
        }
        //关闭浏览器
        webDriver.quit();
    }

5. 浏览器的操作

5.1 浏览器最大化

  • .manage().window().maximize()
	private static void Test09() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com");
        //浏览器最大化
        webDriver.manage().window().maximize();
        //定位到“换一换”这个元素
        String expect_str = webDriver.findElement(By.cssSelector("#hotsearch-refresh-btn > span")).getText();
        //如果“换一换”这个按钮存在,通过
        if (expect_str.equals("换一换")) {
            System.out.println("测试通过");
        }else {
            //如果不存在,就不通过
            System.out.println("测试不通过");
        }
        webDriver.quit();
    }

5.2 设置浏览器宽、高

  • .manage().window().setSize(new Dimension(200,450))
private static void Test10() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        //设置浏览器大小 200*200
        webDriver.manage().window().setSize(new Dimension(200,450));
        //校验百度搜索输入框存不存在
        sleep(3000);
        WebElement webElement = webDriver.findElement(By.cssSelector("#kw"));
        //如果存在,测试通过
        //否则,测试不通过
        if (webElement == null) {
            System.out.println("测试不通过");
        }else {
            System.out.println("测试通过");
        }
        webDriver.quit();
    }

5.3 操作浏览器的前进、后退

  • .navigate().back() 后退
private static void Test11() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        //输入“张三”
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("张三");
        //点击”百度一下“按钮
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        //浏览器后退
        webDriver.navigate().back();
        sleep(3000);
        //获取当前页面 url
        String url = webDriver.getCurrentUrl();
        System.out.println(url);
        //如果当前 url 等于“https://www.baidu.com/”,测试通过
        //否则测试不通过
        if (url.equals("https://www.baidu.com/")) {
            System.out.println("测试通过");
        }else {
            System.out.println("测试不通过");
        }
        webDriver.quit();
    }
  • .navigate().forward() 前进
private static void Test12() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        //输入“张三”
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("张三");
        //点击”百度一下“按钮
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        //浏览器后退
        webDriver.navigate().back();
        sleep(3000);
        //浏览器再进行前进
        webDriver.navigate().forward();
        sleep(3000);
        //获取当前页面 url
        String url = webDriver.getCurrentUrl();
        System.out.println(url);
        //如果当前 url 不等于“https://www.baidu.com/”,测试通过
        //否则测试不通过
        if (!url.equals("https://www.baidu.com/")) {
            System.out.println("测试通过");
        }else {
            System.out.println("测试不通过");
        }
        webDriver.quit();
    }

在这里插入图片描述
上面的 webDriver.get 相当于webDriver.navigate().to

5.4 控制浏览器滚动条

	private static void Test13() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com");
        //输入鲜花
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("鲜花");
        //点击百度一下按钮
        webDriver.findElement(By.cssSelector("#su")).click();
        //等待 3 秒
        sleep(3000);
       //浏览器滚动滑到最下面
        ((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");
        sleep(2000);
        //浏览器滚动滑到最上面
        ((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=0");
        //等待 3 秒
        sleep(3000);
        //关闭浏览器
        webDriver.quit();
    }

6. 键盘事件

6.1 键盘按键

  • 回车:sendKeys(Keys.ENTER)
  • TAB:sendKeys(Keys.TAB)
  • 空格键:sendKeys(Keys.SPACE)
private static void Test14() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com");
        //输入“蛋糕”
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("蛋糕");
        sleep(3000);
        //回车
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.ENTER);
        sleep(3000);
        //校验
        List<WebElement> webElements = webDriver.findElements(By.xpath("//*[@id=\"3001\"]/div/div/div/div[2]/div/a/div/span/font[1]"));
        sleep(3000);
        int flag = 0;
        //找到搜索结果,如果有蛋糕这个关键词对应的元素,测试通过
        for (int i = 0; i < webElements.size(); i++) {
            if (webElements.get(i).getText().equals("蛋糕")) {
                flag = 1;
                break;
            }
        }
        if (flag == 1) {
            System.out.println("测试通过");
        }else {
            System.out.println("测试不通过");
        }
        webDriver.quit();
    }

6.2 键盘组合键

 private static void Test15() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com");
        //输入“蛋糕”
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("蛋糕");
        sleep(3000);
        //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);
        //点击百度一下
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        //校验
        String no_expected_url = "https://www.baidu.com";
        String cur_url = webDriver.getCurrentUrl();

        if (!cur_url.equals(no_expected_url)) {
            System.out.println("测试通过");
        }else {
            System.out.println("测试不通过");
        }
        webDriver.quit();
    }

7. 鼠标事件

private static void Test16() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com");
        //输入“企业微信”
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("企业微信");
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        //鼠标操作
        //先要创建一个 Actions 对象
        Actions actions = new Actions(webDriver);
        sleep(3000);
        //找到目标元素(图片这个按钮)
        WebElement target = webDriver.findElement(By.cssSelector("#searchTag > div > div > a:nth-child(2) > span"));
        sleep(3000);
        //鼠标挪动到这个按钮上
        actions.moveToElement(target).contextClick().perform();
    }

如果右击要看到效果,需要执行一下 perform

8. 切换窗口、截图

8.1 切换窗口

	private static void Test17() 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(5000);

        // 获取到当前的窗口句柄
        String cur_handle = webDriver.getWindowHandle();
        System.out.println("当前窗口句柄等于:" + cur_handle);
        // 获取到浏览器当前所有的窗口句柄
        Set<String> all_handles = webDriver.getWindowHandles();
        String target = "";
        // 遍历当前浏览器所有的窗口句柄
        for (String temp : all_handles) {
            if(!temp.equals(cur_handle)) {
                webDriver.switchTo().window(temp);
            }
        }
        // 将窗口句柄切换到最后一个窗口句柄
        sleep(3000);
        // 找到新闻搜索框
        // 输入“经济新闻头条”
        webDriver.findElement(By.cssSelector("#ww")).sendKeys("经济头条");
        // 点击百度一下按钮
        webDriver.findElement(By.cssSelector("#s_btn_wr")).click();
        // 找到搜索结果
        // 如果搜索结果中包含经济或者头条,此时测试通过
        sleep(3000);
        List<WebElement> webElements = webDriver.findElements(By.xpath("//em[text()=\"经济\"]"));
        sleep(3000);
        int flag = 0;
        for(int i = 0; i < webElements.size(); i++) {
            if(webElements.get(i).getText().equals("经济") || webElements.get(i).getText().equals("头条")) {
                flag = 1;
                break;
            }
        }
        if(flag == 1) {
            System.out.println("测试通过");
        } else {
            System.out.println("测试不通过");
        }
    }

8.2 截图

现在 xml 文件中,加入截图的依赖

		<!--        截图-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>
private static void Test18() 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临时变量中
        File file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
        //把file保存到磁盘中
        FileUtils.copyFile(file, new File("D:\\代码仓库\\learn_Java\\learn_-java\\截图\\2024_3_18.png"));
        webDriver.quit();
    }

9. 定位一组元素

private static void Page01() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://localhost:63342/selenium_test1/Page/test01.html?_ijt=b3kq3no43nmglu665q8si5sd9p");
        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();
            }
        }
    }

10. 多层框架/窗口定位

private static void Page02() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://localhost:63342/selenium_test1/Page/test02.html?_ijt=1vil5pbc1b803cqqjq4k7l3mhe");
        webDriver.switchTo().frame("f1");
        sleep(3000);
        webDriver.findElement(By.cssSelector("body > div > div > a")).click();
    }

11. 下拉框处理

11.1 定位下拉框

private static void Page03() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://localhost:63342/selenium_test1/Page/test03.html?_ijt=m2cpav9la0kb1hfsjf795f0j47");
        //借助select对象
        WebElement webElement = webDriver.findElement(By.cssSelector("#ShippingMethod"));
        Select select = new Select(webElement);

        //TODO 第一种方式
        //通过序号选中选项,下标和之前学习的数组一样的,下标是从0开始
        /*select.selectByIndex(2);
        sleep(3000);*/

		//TODO 第二种方式
        //通过标签option标签里面 value 的值
        select.selectByValue("8.34");
    }

11.2 定位弹窗

private static void Page04() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://localhost:63342/selenium_test1/Page/test04.html?_ijt=i0iq6i4889bpv43q0ms5k5tnca");
        sleep(3000);
        webDriver.findElement(By.cssSelector("body > button")).click();
        //点击了弹窗里面的取消
        webDriver.switchTo().alert().dismiss();
        //点击页面上的按钮,出现弹窗
        webDriver.findElement(By.cssSelector("body > button")).click();
        String name = "草莓";
        //弹窗里面输入“草莓”
        webDriver.switchTo().alert().sendKeys(name);
        sleep(3000);
        //弹窗确认
        webDriver.switchTo().alert().accept();
        sleep(3000);
        String text = webDriver.findElement(By.cssSelector("body > div:nth-child(4)")).getText();
        if (text.equals(name)) {
            System.out.println("测试通过");
        }else {
            System.out.println("测试不通过");
        }
    }

12. 上传文件

private static void Page05() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://localhost:63342/selenium_test1/Page/test05.html?_ijt=8m299g4gcpepptcda6ag3h61k5");
        sleep(3000);
        //上传文件
        webDriver.findElement(By.cssSelector("body > input[type=file]")).sendKeys("C:\\Users\\r\\Pictures\\Saved Pictures\\01.webp");
    }

相关推荐

  1. 软件测试 -- 自动化测试(Selenium)

    2024-03-19 11:46:06       38 阅读
  2. 软件测试自动化:加速测试,提升效率

    2024-03-19 11:46:06       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-19 11:46:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-19 11:46:06       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-19 11:46:06       82 阅读
  4. Python语言-面向对象

    2024-03-19 11:46:06       91 阅读

热门阅读

  1. 2022蓝桥杯/李白打酒加强版/c\c++

    2024-03-19 11:46:06       34 阅读
  2. windows平台Qt5连接wifi

    2024-03-19 11:46:06       34 阅读
  3. C++ 11

    C++ 11

    2024-03-19 11:46:06      32 阅读
  4. 一个j简单显示框架及简单实现再探编程_C++

    2024-03-19 11:46:06       35 阅读
  5. csv编辑器是干什么的?

    2024-03-19 11:46:06       37 阅读
  6. C++/CLI学习笔记12(快速打通c++与c#相互调用的桥梁)

    2024-03-19 11:46:06       36 阅读
  7. 【 React 】Real DOM 和Virtual DOM的区别?优缺点?

    2024-03-19 11:46:06       37 阅读
  8. React+umi+dva 项⽬实战-lesson6

    2024-03-19 11:46:06       44 阅读