软件测试之自动化测试【webdriver API】

目录

一、webdriver API

1.元素的定位

2.操作测试对象

3.添加等待

3.1 sleep 强制等待

3.2 隐式等待

3.3 显式等待 

4.打印信息

5.浏览器的操作

5.1 浏览器的前进和后退

5.2 浏览器滚动条操作

5.3 浏览器最大化及设置浏览器宽、高

6.键盘按键

7. 鼠标事件

8.定位一组元素

9.多层框架/窗口定位

9.1 多层框架的定位

9.2 多窗口定位

10.下拉框处理

11.alert、confifirm、prompt 的处理

11.1 alert 弹窗操作 

12.上传文件操作

13.关闭浏览器

14.切换窗口

15.截图


🌈上节课我们已经学习了webdriver API 中元素的定位、操作测试对象,如果对自动化测试还没有了解的朋友,请看我的上一篇文章:软件测试之自动化测试_奋斗小温的博客-CSDN博客

🔥接下来的测试课我们继续讲解 webdriver API,请继续关注我,这节课是本章自动化测试的一个核心知识点+高频面试题❗❗❗


一、webdriver API

1.元素的定位

2.操作测试对象

如果这两个内容没有听懂的朋友,请看我博客测试专栏的上一篇文章:软件测试之自动化测试_奋斗小温的博客-CSDN博客

3.添加等待

3.1 sleep 强制等待

如果是等待 3 天时间,强制等待一直等待,等待的时间是 3 天

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import static java.lang.Thread.sleep;

//强制等待
public class Main5 {
    public static void main(String[] args) throws InterruptedException {
        test02();
    }

    //clear 清除对象输入的文本内容
    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);
        //找到百度输入框的:id为kw,并且输入“什么是测试”
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("什么是测试");
        //找到百度一下按钮:“su”,并且点击
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(300000000);
        //清除百度输入框的中的数据
        webDriver.findElement(By.cssSelector("#kw")).clear();
    }
}

2ccb6912ac5146a286bb13ef5f50165f.png

3.2 隐式等待

  • 通过添加 implicitlyWait() 方法就可以方便的实现智能等待;implicitlyWait(30) 的用法比 sleep() 更智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。
WebDriver.Timeouts implicitlyWait(long var1, TimeUnit var3);
  • 隐式地等待并非一个固定的等待时间,当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它以轮询的方式不断的判断元素是否被定位到。直到超出设置的时长

假设等待3天时间:这里隐式等待最长等待为3天,如果3天内获取到页面上的元素,此时执行下边的代码;如果等待3天时间还是没有找到这个元素,此时报错

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import java.util.concurrent.TimeUnit;
import static java.lang.Thread.sleep;


//等待
public class Main5 {
    public static void main(String[] args) throws InterruptedException {
        test02();
    }

    //clear 清除对象输入的文本内容
    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);
        //找到百度输入框的:id为kw,并且输入“什么是测试”
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("什么是测试");
        //找到百度一下按钮:“su”,并且点击
        webDriver.findElement(By.cssSelector("#su")).click();
        //sleep(300000000);//强制等待
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);
        //清除百度输入框的中的数据
        webDriver.findElement(By.cssSelector("#kw")).clear();
    }
}

1428b51ef7a1488a95b0476afdb000da.png

3.3 显式等待 

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.util.concurrent.TimeUnit;
import static java.lang.Thread.sleep;

public class Main7 {
    public static void main(String[] args) throws InterruptedException {
        test02();
    }

    private static void test02() throws InterruptedException {
        //创建驱动
        WebDriver webDriver = new ChromeDriver();
        //打开百度首页
        webDriver.get("https://www.baidu.com");
        // 判断元素是否可以被点击
        //显式等待
        WebDriverWait wait = new WebDriverWait(webDriver, 3000);
        wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#bottom_layer > div > p:nth-child(8)")));

    }
}
  •  隐式等待:等待的是所有的元素
  • 显式等待:等待的是一定的条件(程序员自己设定)

4.打印信息

1️⃣打印 title    2️⃣打印 url

测试用例:检验百度首页的 url 和 title 是否符合预期

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

public class Main6 {
    public static void main(String[] args) throws InterruptedException {
        test();
    }

    //clear 清除对象输入的文本内容
    private static void test() throws InterruptedException {
        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("当前页面url:" + url + "当前页面title:" + title);
            System.out.println("测试通过");
        } else {
            System.out.println("测试不通过");
        }
    }
}

cb7aec8deef944adb796cde2df2f1d94.png

5.浏览器的操作

5.1 浏览器的前进和后退

前进:webDriver.navigate().forward();

后退:webDriver.navigate().back();

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import static java.lang.Thread.sleep;

public class Main8 {
    public static void main(String[] args) throws InterruptedException {
        test02();
    }

    private static void test02() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        //打开百度首页
        webDriver.get("https://www.baidu.com/");
        //搜索 521
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("521");//百度输入框的:id为kw
        sleep(3000);//强制等到3秒
        webDriver.findElement(By.cssSelector("#su")).click();//百度一下按钮:“su”
        //浏览器后退
        sleep(3000);
        webDriver.navigate().back();
        //强制等待3秒
        sleep(3000);
        webDriver.navigate().refresh();//刷新
        //浏览器前进
        sleep(3000);
        webDriver.navigate().forward();
    }

}

d60c77bfef8640839ed9689fd27d8e45.png

5.2 浏览器滚动条操作

浏览器滚动条的控制需要依靠js脚本

#将浏览器滚动条滑到最顶端
document.documentElement.scrollTop=0
#将浏览器滚动条滑到最底端
document.documentElement.scrollTop=10000

例如:

.测试案例:搜索521,然后滚动条滑倒最下边

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptException;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import static java.lang.Thread.sleep;
public class Main9 {
    public static void main(String[] args) throws InterruptedException {
        test02();
    }

    private static void test02() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        //打开百度首页
        webDriver.get("https://www.baidu.com/");
        //搜索 521
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("521");//百度输入框的:id为kw
        sleep(3000);//强制等到3秒
        webDriver.findElement(By.cssSelector("#su")).click();//百度一下按钮:“su”
        sleep(3000);
        ((JavascriptExecutor)webDriver).executeAsyncScript("document.documentElement.scrollTop=10000");
    }

}

5.3 浏览器最大化及设置浏览器宽、高

浏览器最大化:

webDriver.manage().window().maximize();

设置浏览器宽、高:

webDriver.manage().window().setSize(new Dimension(width, high));

例如:

测试案例:先打开一个浏览器,继续打开百度网页,搜索521并且百度一下,进行浏览器后退、浏览器前进、滚动条滑动、浏览器最大化、浏览器悬停和设置浏览器宽、高

import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import static java.lang.Thread.sleep;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        test02();
    }

    private static void test02() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        //打开百度首页
        webDriver.get("https://www.baidu.com/");
        //搜索 521
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("521");//百度输入框的:id为kw
        sleep(3000);//强制等到3秒
        webDriver.findElement(By.cssSelector("#su")).click();//百度一下按钮:“su”
        //浏览器后退
        sleep(3000);
        webDriver.navigate().back();
        //强制等待3秒
        sleep(3000);
        webDriver.navigate().refresh();//刷新
        // 浏览器前进
        sleep(3000);
        webDriver.navigate().forward();
        sleep(3000);
        //浏览器滚动条操作
        ((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");
        //浏览器最大化
        webDriver.manage().window().maximize();
        sleep(3000);
        //浏览器悬停
        webDriver.manage().window().fullscreen();
        sleep(3000);
        //设置浏览器宽、高
        webDriver.manage().window().setSize(new Dimension(600, 1000));
    }

}

6.键盘按键

要使用键盘按键,必须引入keys 包:

from selenium.webdriver.common.keys import Keys

通过 send_keys() 调用按键

sendKeys(Keys.TAB) # TAB
sendKeys(Keys.ENTER) # 回车
sendKeys(Keys.SPACE) #空格键
sendKeys(Keys.ESCAPE) #回退键(Esc)
sendKeys(Keys.CONTROL,'a') #全选(Ctrl+A)
sendKeys(Keys.CONTROL,'c') #复制(Ctrl+C)
sendKeys(Keys.CONTROL,'x') #剪贴(Ctrl+X)
sendKeys(Keys.CONTROL,'v') #粘贴(Ctrl+V)

例如:

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import static java.lang.Thread.sleep;

public class Main10 {
    public static void main(String[] args) throws InterruptedException {
        test();
    }

    private static void test() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("521");
        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");
        //ctrl+V
        sleep(3000);
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL, "V");
    }

}

7. 鼠标事件

要使用鼠标事件需要导入工具包:

import org.openqa.selenium.interactions.Actions;

语法:

#鼠标拖动事件
Actions(webDriver).moveToElement(webElement).contextClick().perform();
  • Actions(webDriver):生成用户的行为。所有的行动都存储在actionchains 对象。通过perform()存储的行为。
  • moveToElement(element):移动鼠标到一个元素中,menu 上面已经定义了他所指向的哪一个元素
  • perform():执行所有存储的行为
  • ActionChains
  1. context_click() 右击
  2. double_click() 双击
  3. drag_and_drop() 拖动
  4. move_to_element() 移动

测试案例:打开百度首页,搜索520并且百度一下,把鼠标放在图片的按钮上进行右击

🌈如何找到图片的按钮:F12进行元素选择,把鼠标放在图片上进行定位,右击进行Copy,选择 Copy selector

fcba07339f094aecabe0c9cd7d61edd2.png

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import static java.lang.Thread.sleep;
//鼠标事件

public class Main11 {
    public static void main(String[] args) throws InterruptedException {
        test();
    }

    private static void test() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("520");
        sleep(3000);
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        //找到图片按钮
        WebElement webElement = 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(webElement).contextClick().perform();
    }

}

407f2f1870984ceb986fa13232c442ab.png

8.定位一组元素

webdriver 可以很方便的使用findElement 方法来定位某个特定的对象

定位一组对象一般用于以下场景:

  • 批量操作对象,比如将页面上所有的checkbox 都勾上
  • 先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的checkbox,然后选择最后一个

HTML 示例测试:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Checkbox</title>
</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>
    <div class="control-group">
      <label class="control-label" for="r">radio</label>
      <div class="controls">
        <input type="radio" id="r1" />
      </div>
    </div>
    <div class="control-group">
      <label class="control-label" for="r">radio</label>
      <div class="controls">
        <input type="radio" id="r2" />
      </div>
    </div>
  </form>
</div>
</body>
</html>

5299d3a9847043ceaeb90573e87a8358.png

 用浏览器打开这个页面我们看到三个复选框和两个单选框,下面我们就来定位这三个复选框

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        test();
    }

    private static void test() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("file:///D:/Self_learning/tesk/test/Test/checkbox.html");
        //隐式等待
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);
        List<WebElement> webElements = webDriver.findElements(By.cssSelector("input"));
        for(int i = 0; i < webElements.size(); i++) {
            // 如果每个元素type值等于checkbox进行点击
            // getAttribute获取页面上的元素属性值,里面的type是当前元素属性
            if(webElements.get(i).getAttribute("type").equals("checkbox")){
                webElements.get(i).click();
            } else {
                // 否则什么也不操作
                ;
            }
        }

    }
}

6107a21d817f4c49b2ca920e60419a80.png

9.多层框架/窗口定位

对于一个web 应用,经常会出现框架(frame) 或窗口(window)的应用,这也就给我们的定位带来了一定的困难。

  • 定位一个frame :switchTo.frame(name or id or frameElement)
  • 定位一个窗口window:switchTo.window(name or id or frameElement)

9.1 多层框架的定位

  • switchTo.frame(name or id or frameElement):通过frame的id或者name或者frame自带的其它属性来定位框架,这里switchTo.frame()把当前定位的主体切换了frame里。
  • switchTo.defaultContent:从frame中嵌入的页面里跳出,跳回到最外面的默认页面中。

HTML 示例测试(frame.html、inner.html):设计一个多框架页面的定位

 frame.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>frame</title>
    <!--  <link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.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="f1" src="inner.html" width="800", height="600"></iframe>
        </div>
    </div>
</body>
<!--<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>-->
</html>

inner.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>inner</title>
</head>
<body>
    <div class="row-fluid">
        <div class="span6 well">
            <h3>inner</h3>
            <iframe id="f2" src="https://www.baidu.com/"
                width="700"height="500"></iframe>
            <a href="javascript:alert('watir-webdriver better than selenium webdriver;')">click</a>
        </div>
    </div>
</body>
</html>

195d22b7654c4b3fae5a952f1d4ff793.png

下面通过switchTo.frame() 方法来获取 frame 中的属性进行定位:

不可以直接用 webDriver.findElement(By.cssSelector(" ")).click();,因为 frame 里边的元素是获取不到

c1d47e8d6bbf41d78794f4cbe6083e45.png

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
//多框架定位

public class Main {
    public static void main(String[] args) throws InterruptedException {
        test();
    }

    private static void test() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        //打开html写的多框架页面
        webDriver.get("file:///D:/Self_learning/tesk/test/Test/frame.html");
        //获取 frame 中的属性
        webDriver.switchTo().frame("f1");
        //选择click按钮,点击
        webDriver.findElement(By.cssSelector("body > div > div > a")).click();
    }
}

4cf7fc576c3840ea8892cbc2af7244b5.png

9.2 多窗口定位

有可能嵌套的不是框架,而是窗口,还有真对窗口的方法:switchTo.window(用法与 switchTo.frame 相同)

10.下拉框处理

下拉框是我们最常见的一种页面元素,对于一般的元素,我们只需要一次就定位,但下拉框里的内容需要进行两次定位,先定位到下拉框对下拉框进行操作后,再定位到下拉框内里的选项。

HTML示例说明:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>select</title>
</head>
<body>
    <select id="ShippingMethod" onchange="updateShipping(options[selectedIndex]);" name="ShippingMethod">
        <option value="12.51">UPS Next Day Air ==> $12.51</option>
        <option value="11.61">UPS Next Day Air Saver ==> $11.61</option>
        <option value="10.69">UPS 3 Day Select ==> $10.69</option>
        <option value="9.03">UPS 2nd Day Air ==> $9.03</option>
        <option value="8.34">UPS Ground ==> $8.34</option>
        <option value="9.25">USPS Priority Mail Insured ==> $9.25</option>
        <option value="7.45">USPS Priority Mail ==> $7.45</option>
        <option value="3.20" selected="">USPS First Class ==> $3.20</option>
    </select>
</body>
</html>

c9dfcbdbfa84414eb47cf003677e5612.png

 代码实现

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.Select;
//下拉框处理

public class Main {
    public static void main(String[] args) throws InterruptedException {
        test();
    }

    private static void test() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        //打开html写的多框架页面
        webDriver.get("file:///D:/Self_learning/tesk/test/Test/select.html");
        //选择下拉框按钮
        WebElement webElement = webDriver.findElement(By.cssSelector("#ShippingMethod"));
        //使用 select 完成下拉框操作
        Select select = new Select(webElement);
        //下标定位——从0开始
        select.selectByIndex(3);
        //值定位——源码属性的值
        select.selectByValue("12.51");

    }
}

下标定位——从0开始(select.selectByIndex(3);)

38bb148e9fa6456787b802772bdfc165.png

 值定位——源码属性的值(select.selectByValue("12.51");)

7a22195e68bd4071a59b08ed5de25d13.png

c173e132fe4c45348cf606631ccf6f23.png

11.alertconfifirmprompt 的处理

  • text 返回 alert / confirm / prompt 中的文字信息
  • accept 点击确认按钮
  • dismiss 点击取消按钮
  • sendKeys 输入值,如果alert 没有对话框就不能用了,不然会报错

❗❗注意:switchTo.alert() 只能处理原生的alert

11.1 alert 弹窗操作 

HTML示例说明:弹窗操作

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>title</title>
</head>
<body>
    <button onclick="Click()">这是一个弹窗</button>
</body>
<script type="text/javascript">
    function Click() {
        let name = prompt("请输入姓名:");
        let parent = document.querySelector("body");
        let child = document.createElement("div");
        child.innerHTML = name;
        parent.appendChild(child)
    }
    </script>
</html>

75a34e57ba92456c8ab898f9cfc2bb09.png

 测试案例:代码编写一个 alert 弹窗,在弹窗中输入奋斗小温,随后 alert 弹窗确认

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import static java.lang.Thread.sleep;

//针对 alert 操作

public class Main15 {
    public static void main(String[] args) throws InterruptedException {
        test();
    }

    private static void test() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        //打开html写的多框架页面
        webDriver.get("file:///D:/Self_learning/tesk/test/Test/title1.html");
        //找到弹窗按钮并点击
        webDriver.findElement(By.cssSelector("button")).click();
        sleep(3000);
        // alert 弹窗取消
        webDriver.switchTo().alert().dismiss();
        sleep(3000);
        // 点击按钮
        webDriver.findElement(By.cssSelector("button")).click();
        //在 alert 弹窗中输入奋斗小温
        webDriver.switchTo().alert().sendKeys("奋斗小温");
        sleep(3000);
        // alert 弹窗确认
        webDriver.switchTo().alert().accept();
    }
}

13bf186b0b7943429294ec8bf9428048.png

 confirm、prompt 操作与 alert相同

12.上传文件操作

🌈只要定位上传按钮,通过 sendKeys 添加本地文件路径就可以了。绝对路径和相对路径都可以,关键是上传的文件存在。

HTML代码示例:上传文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>upload_file上传文件</title>
</head>
<body>
    <input type="file">
</body>
</html>

9da0f955b0d140ed82857ab5cdc84ee3.png

 测试案例:实现一个上传文件需求

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
// 上传文件操作

public class Main16 {
    public static void main(String[] args) throws InterruptedException {
        test();
    }

    private static void test() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        //打开html写的多框架页面
        webDriver.get("file:///D:/Self_learning/tesk/test/Test/upload_file.html");
        //实现文件上传
        webDriver.findElement(By.cssSelector("input")).sendKeys("D:\\图片\\Saved Pictures");
    }
}

9c34b42e3b7c4a5d9d67b0e60fcca6ae.png

13.关闭浏览器

关闭操作分为两种:

  1. quit() :关闭整个浏览器(并且清空缓存)
  2. close() :只是关闭原始页面(从哪里跳转来的页面)(并且不会清空缓存)

测试案例:打开百度首页,点击新闻按钮,通过 quit 和 click 方法关闭浏览器

47c43a6d6f954987b696c2911681a7bc.png

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import static java.lang.Thread.sleep;
//关闭浏览器
public class Main17 {
    public static void main(String[] args) throws InterruptedException {
        test();
    }

    private static void test() 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(4000);
        //webDriver.quit();//关闭整个浏览器页面
        webDriver.close();//只是关闭原始页面(从哪里跳转来的页面)

    }
}

52725c0514954b15872c8c504ba1faa4.png

14.切换窗口

测试案例:打开百度首页,点击新闻按钮,在百度新闻框输入“新闻联播”并且点击百度一下

  • getWindowHandles 获取所有的窗口句柄
  • getWindowHandle 获取 get 打开的页面窗口句柄
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.Set;
import static java.lang.Thread.sleep;
//切换窗口

public class Main18 {
    public static void main(String[] args) throws InterruptedException {
        test();
    }

    private static void test() 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);
        // 通过 getWindowHandles 获取所有的窗口句柄
        // 通过 getWindowHandle 获取 get 打开的页面窗口句柄
        //获取当前页面元素
        Set<String> handles = webDriver.getWindowHandles();
        String target_handle = "";
        for (String handle : handles) {
            target_handle = handle;
        }
        webDriver.switchTo().window(target_handle);
        sleep(3000);
        //找到新闻页面下的输入框
        webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");
        //找到新闻页面下的百度一下
        webDriver.findElement(By.cssSelector("#s_btn_wr")).click();
    }
}

3c651a82bd464e799b703d3daba3fea7.png

15.截图

截图需要导入 common-io 依赖:Maven Repository: Search/Browse/Explore (mvnrepository.com)

搜索 common-io,复制依赖到 pom.xml 中

70eef7dc51d14682a9196542995d33ec.png

 pom.xml 中的代码(引入依赖):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>Test2</artifactId>
    <version>1.0-SNAPSHOT</version>
    <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>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>
    </dependencies>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
</project>

测试案例:打开百度首页,输入“软件测试”,对测试页面进行截图 

截图:((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE); 

复制到硬盘:FileUtils.copyFile(File srcFile, File destFile);

import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.io.File;
import java.io.IOException;
import static java.lang.Thread.sleep;

//截图

public class Main19 {
    public static void main(String[] args) throws InterruptedException, IOException {
        test();
    }

    private static void test() 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 = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
        //复制到硬盘
        FileUtils.copyFile(file, new File("D://20230526jietu.png"));
    }
}

d1889805b3654087b9d3355594e3513e.png


 此时我们就已经学完了 webdriver API

  1. 定位元素:xpath、css 选择器
  2. 操作测试对象:点击(click、submit)、键盘输入
  3. 信息获取:url 获取、title 获取、某个属性值获取
  4. 鼠标操作
  5. 浏览器操作
  6. alert 操作
  7. 选项操作
  8. 截图操作
  9. 浏览器关闭操作
  10. 切换 frame
  11. 切换窗口

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/25501.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

12-Vue技术栈之Vuex的使用

目录 1、理解 vuex1.1 vuex 是什么1.2 什么时候使用 Vue1.3 图解两种方式实现数据共享 2、搭建vuex环境2.1 下载vuex2.2 配置文件 3、基本使用3.1 求和案例纯vue写法3.2 求和案例vuex写法 4、getters的使用5、四个map方法的使用5.1 求和案例 6、 模块化命名空间6.1求和案例改造…

linux网络设置

文章目录 一、查看网络配置1.查看网络接口信息——ifconfig1.1查看所有本机的网络的网络设备1.2设置网络接口参数1.3对指定的设备开启或关闭 2.查看主机名称——hostname2.1查看或临时设置当前主机名2.2永久设置主机名 3.查看路由表条目——route3.1查看当前主机路由表3.2添加路…

Redis入门到实战笔记-数据类型

这里写目录标题 SQL与NoSQL关系型数据库&#xff1a;查询方式&#xff1a; 非关联数据库&#xff1a;查询方式&#xff1a; 总结 认识RedisRedis安装远程连接防火墙设置关闭防火墙开启防火墙检查防火墙状态开放指定端口 Redis数据类型和常见命令keysdelEXISTexpired&#xff0c…

C++——多态与虚表

目录 1.多态的实现 2.虚表 2.1虚函数重写是怎么实现的 2.2多态的原理 2.3静态绑定与动态绑定 3.单继承体系中的虚函数表 ​编辑4.多继承体系中的虚函数表 5.菱形继承的虚函数表 6.菱形虚拟继承的虚函数表 1.多态的实现 在C中&#xff0c;要想实现多态&#xff0c;必…

Metasploit超详细安装及使用教程(图文版)

通过本篇文章&#xff0c;我们将会学习以下内容&#xff1a; 1、在Windows上安装Metasploit 2、在Linux和MacOS上安装Metasploit 3、在Kali Linux中使用 Metasploit 4、升级Kali Linux 5、使用虚拟化软件构建渗透测试实验环境 6、配置SSH连接 7、使用SSH连接Kali 8、配…

Ansible基础6——文件模块、jinja2模板

文章目录 一、常用文件模块1.1 blockinfile模块1.2 file模块1.2.1 创建文件并赋予权限1.2.2 创建目录并赋予权限1.2.3 创建软连接1.2.4 删除文件或目录 1.3 fetch模块1.4 lineinfile模块1.5 stat模块1.6 synchronize模块 二、jinja2模板2.1 构建jinja2模板2.2 管理jinja2模板2.…

MAYLAND HOME官网上线 | LTD家居家装行业案例分享

​一、公司介绍 在MAYLAND HOME&#xff0c;我们为我们对质量和服务的承诺感到自豪。我们相信我们的成功与客户的满意度直接相关&#xff0c;这就是为什么我们努力超越您的期望&#xff0c;我们承担的每一个项目。无论您是想升级您的家庭还是企业&#xff0c;我们都会在这里帮助…

冈萨雷斯DIP第5章知识点

图像增强&#xff1a;主要是一种 主观处理&#xff0c;而图像复原很大程度上是一种 客观处理。 5.1 图像退化/复原处理的一个模型 如图5.1 本章把图像退化建模为一个算子 H \mathcal{H} H 该算子 与一个加性噪声项 η ( x , y ) η(x,y) η(x,y) 共同对输入图像 f ( x , y…

MKS SERVO4257D 闭环步进电机_系列2 菜单说明

第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口&#xff0c;支持MODBUS-RTU通讯协议&#xff0c;内置高效FOC矢量算法&#xff0c;采用高精度编码器&#xff0c;通过位置反馈&am…

开源情报搜集系统的核心技术

随着科技快速发展&#xff0c;科研方向的开源情报搜集系统的应用越来越广泛。为了满足科研工作者的需求&#xff0c;开发人员大力研发了许多功能强大的科研开源情报系统。这些系统不仅可以帮助科研人员更加高效地获取、管理和利用科研信息资源&#xff0c;还能为他们提供全方位…

原来CSS的登录界面可以变得这么好看

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大一在校生&#xff0c;web前端开发专业 &#x1f921; 个人主页&#xff1a;几何小超 &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目…

Sequelize:Node.js 中的强大 ORM 框架

❤️砥砺前行&#xff0c;不负余光&#xff0c;永远在路上❤️ 目录 前言优势&#xff1a;提高效率&#xff0c;不用SQL即可完成数据库操作。 那什么是 Sequelize&#xff1f;主要特性&#xff1a;1、模型定义和映射&#xff1a;2、关联和联接&#xff1a;3、事务管理&#xff…

【网络协议详解】——DNS系统协议(学习笔记)

目录 &#x1f552; 1. DNS的作用&#x1f552; 2. 域名结构&#x1f552; 3. 域名分类&#x1f552; 4. 域名空间&#x1f552; 5. 域名服务器类型&#x1f558; 5.1 根域名服务器&#x1f558; 5.2 顶级域名服务器&#x1f558; 5.3 权限域名服务器&#x1f558; 5.4 本地域名…

英睿达内存条正品鉴别教程(镁光颗粒)

我们打算买一款二手镁光颗粒的英睿达内存条,需要从正面内存标签上的条形码、字串,从背面颗粒上的两行字符一一分析、检查、鉴别,最终确认是否正品,以及内存条等级如何。通过本片文章,您能学会如何进行镁光颗粒的英睿达内存条正品鉴别。 一、标签检查 首先,用百度条形码…

[数据集][目标检测]目标检测数据集大白菜数据集VOC格式1557张

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;1557 标注数量(xml文件个数)&#xff1a;1557 标注类别数&#xff1a;1 标注类别名称:["cabbage"] 每…

mysql查询语句执行过程及运行原理命令

Mysql查询语句执行原理 数据库查询语句如何执行&#xff1f; DML语句首先进行语法分析&#xff0c;对使用sql表示的查询进行语法分析&#xff0c;生成查询语法分析树。语义检查&#xff1a;检查sql中所涉及的对象以及是否在数据库中存在&#xff0c;用户是否具有操作权限等视…

Spring Boot 数据库操作Druid和HikariDataSource

目录 Spring Boot 数据库操作 应用实例-需求 创建测试数据库和表 进行数据库开发&#xff0c; 在pom.xml 引入data-jdbc starter 参考官方文档 需要在pom.xml 指定导入数据库驱动 在application.yml 配置操作数据源的信息 创建bean\Furn.java 测试结果 整合Druid 到…

编码,Part 1:ASCII、汉字及 Unicode 标准

个人博客 编码的历史由来就懒得介绍了&#xff0c;只需要知道人类处理文本信息是以字符为基本单位&#xff0c;而计算机在最底层只认识 0/1&#xff0c;所以当计算机要为人类存储/呈现字符时&#xff0c;就需要有一个规则&#xff0c;在字符和 0/1 序列之间建立映射关系&#…

Java经典笔试题—day14

Java经典笔试题—day14 &#x1f50e;选择题&#x1f50e;编程题&#x1f36d;计算日期到天数转换&#x1f36d;幸运的袋子 &#x1f50e;结尾 &#x1f50e;选择题 (1)定义学生、教师和课程的关系模式 S (S#,Sn,Sd,Dc,SA &#xff09;&#xff08;其属性分别为学号、姓名、所…

网络通信IO模型上

计算机组成 计算机由软件和硬件组成&#xff0c;软件包括CPU、内存等&#xff0c;硬件包括主板&#xff0c;磁盘&#xff0c;IO设备&#xff08;网卡、鼠标、键盘等&#xff09;、电源按钮。 内核程序加载过程 当接通电源的时候1、BIOS就会把它的一段代码放入了内存当中&#…