当前位置: 首页 > article >正文

Web⾃动化测试及常用函数

目录

1.准备工作

1.1安装驱动管理

1.2Selenium

1.3⼀个简单的web⾃动化示例

2.操作测试对象

2.1点击/提交对象

2.2 模拟按键输⼊ 

2.3清除⽂本内容 

2.4 获取⽂本信息

 2.5获取当前⻚⾯标题

2.6获取当前⻚⾯URL  

3.窗⼝

3.1 切换窗⼝  

3.2窗⼝设置大小

4.屏幕截图 

5.等待

5.1强制等待

5.2隐式等待

5.3显式等待

6.浏览器导航

 6.1打开⽹站

6.2浏览器的前进、后退、刷新 

7.弹窗

8.⽂件上传 

9.浏览器参数设置  

9.1无头模式

9.2浏览器加载策略


1.准备工作

1.1安装驱动管理

WebDriverManager是⼀个开源Java库,以完全⾃动化的⽅式对Selenium WebDriver所需的驱动程 序(如chromedriver、geckodriver、msedgedriver等)进⾏管理(即下载、设置和维护)。

依赖:
        <dependency>
            <groupId>io.github.bonigarcia</groupId>
            <artifactId>webdrivermanager</artifactId>
            <version>5.8.0</version>
        </dependency>

1.2Selenium

selenium是⼀个web⾃动化测试⼯具,selenium中提供了丰富的⽅法供给使⽤者进⾏web⾃动化测
试。
依赖:
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.0.0</version>
        </dependency>

1.3⼀个简单的web⾃动化示例

测试百度搜索关键词;假面骑士

操作:

1. 打开浏览器 使用驱动来打开
2. 输入完整的网址:https://www.baidu.com
3. 找到输入框,并输入关键词:假面骑士
4. 找到百度一下按钮,并点击
5. 关闭浏览器
方法代码:
    //测试百度搜索关键词;假面骑士
    void test01() throws InterruptedException {
        //1. 打开浏览器 使用驱动来打开
        WebDriverManager.chromedriver().setup();
        //增加浏览器配置:创建驱动对象要强制指定允许访问所有的链接
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);
        Thread.sleep(2000);
        //2. 输入完整的网址:https://www.baidu.com
        driver.get("https://www.baidu.com");
        Thread.sleep(2000);
        //3. 找到输入框,并输入关键词:假面骑士
        driver.findElement(By.cssSelector("#kw")).sendKeys("假面骑士");
        Thread.sleep(2000);
        //4. 找到百度一下按钮,并点击
        driver.findElement(By.cssSelector("#su")).click();
        Thread.sleep(2000);
        //5. 关闭浏览器
        driver.quit();
    }

2.操作测试对象

获取到了⻚⾯的元素之后,接下来就是要对元素进⾏操作了。常⻅的操作有点击、提交、输⼊、清
除、获取⽂本。

2.1点击/提交对象

click()
使用:
driver.findElement(By.cssSelector("#su")).click();

隐藏元素不可点击的; 

2.2 模拟按键输⼊ 

sendKeys()
使用:
driver.findElement(By.cssSelector("#kw")).sendKeys("假面骑士");

2.3清除⽂本内容 

输⼊⽂本后⼜想换⼀个新的关键词,这⾥就需要⽤到 clear()
使用:
driver .findElement(By. cssSelector ( "#kw" )).sendKeys( " 我爱游戏 " );
driver.findElement(By. cssSelector ( "#kw" )).clear();
driver .findElement(By. cssSelector ( "#kw" )).sendKeys( " 我爱学习 " );

2.4 获取⽂本信息

获取⽂本信息: getText()
//获得百度热搜第一条
String text = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title")).getText();
System.out.println(text);

 补:获取属性值需要使⽤⽅法 getAttribute("属性名称")

 2.5获取当前⻚⾯标题

getTitle()
使用:
String title = driver.getTitle();

2.6获取当前⻚⾯URL  

getCurrentUrl()
使用:
String currentUrl = driver.getCurrentUrl();

3.窗⼝

对于程序来说它怎么来识别每⼀个窗⼝呢?每个浏览器窗⼝都有⼀个唯 ⼀的属性句柄(handle)来表式,我们就可以通过句柄来切换。

3.1 切换窗⼝  

(1)获取当前⻚⾯句柄:
driver.getWindowHandle();
(2)获取所有⻚⾯句柄:
driver.getWindowHandles()
(3)切换当前句柄为最新⻚⾯:
 String curHandle = driver.getWindowHandle();
        for (String w : driver.getWindowHandles()) {
            if (w != curHandle) {
                driver.switchTo().window(w);
            }
        }

使用例子:

 // 切换窗⼝搜假面骑士
    void test01() throws InterruptedException {
        createDriver();
        Thread.sleep(3000);
        driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        Thread.sleep(3000);
        String curHandle = driver.getWindowHandle();
        for (String w : driver.getWindowHandles()) {
            if (w != curHandle) {
                driver.switchTo().window(w);
            }
        }
        //找到输入框,并输入关键词:假面骑士
        driver.findElement(By.cssSelector("#ww")).sendKeys("假面骑士");
        Thread.sleep(2000);
        //找到百度一下按钮,并点击
        driver.findElement(By.cssSelector("#s_btn_wr")).click();
        Thread.sleep(2000);
        //关闭窗⼝
        driver.close();
        Thread.sleep(2000);
        driver.quit();
    }

3.2窗⼝设置大小

// 窗⼝最⼤化
driver.manage().window().maximize();
// 窗⼝最⼩化
driver.manage().window().minimize();
// 全屏窗⼝
driver.manage().window().fullscreen();
// ⼿动设置窗⼝⼤⼩
driver.manage().window().setSize( new Dimension ( 1024 , 1024 ));


4.屏幕截图 

我们的⾃动化脚本⼀般部署在机器上⾃动的去运⾏,如果出现了报错,我们是不知道的,可以通过抓 拍来记录当时的错误场景.
屏幕截图⽅法需要额外导⼊包:
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

 套路代码:

 void getScreenShot(String str) throws IOException {

        //     ./src/test/image/
        //                     /2024-07-17/
        //                                /test01-174530.png
        //                                /test02-174530.png
        //                     /2024-07-18/
        //                                /test01-174530.png
        //                                /test02-174530.png
        //屏幕截图
        SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sim2 = new SimpleDateFormat("HHmmss");

        String dirTime = sim1.format(System.currentTimeMillis());
        String fileTime = sim2.format(System.currentTimeMillis());

        //./src/test/image/2024-07-17/test01-174530.png
        String filename ="./src/test/image/"+ dirTime +"/" + str + "-" + fileTime+".png";
        System.out.println("filename:"+filename);
        File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        //srcFile放到指定位置
        FileUtils.copyFile(srcFile,new File(filename));
    }

5.等待

通常代码执⾏的速度⽐⻚⾯渲染的速度要快,如果避免因为渲染过慢出现的⾃动化误报的问题呢?可 以使⽤selenium中提供的三种等待⽅法:

5.1强制等待

Thread.sleep()
优点:使⽤简单,调试的时候⽐较有效
缺点:影响运⾏效率,浪费⼤量的时间

5.2隐式等待

隐式等待是⼀种智能等待,他可以规定在查找元素时,在指定时间内不断查找元素。如果找到则代码 继续执⾏,直到超时没找到元素才会报错。

 implicitlyWait() 参数:Duration类中提供的毫秒、秒、分钟等⽅法

例子:

隐式等待2
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));
隐式等待 作⽤域 是整个脚本的所有元素。即只要driver对象没有被释放掉(driver.quit()),隐式等待 就⼀直⽣效。
优点:智能等待,作⽤于全局。

5.3显式等待

显⽰等待也是⼀种智能等待,在指定超时时间范围内只要满⾜操作的条件就会继续执⾏后续代码

涉及到selenium.support.ui.ExpectedConditions包下的ExpectedConditions类
返回值:boolean
ExpectedConditions预定义⽅法的⼀些示例:
elementToBeClickable(By locator) ‒ ⽤于检查元素的期望是可⻅的并已启⽤,以便您
可以单击它。
textToBe (Bylocator String str) - 检查元素。
presenceOfElementLocated(Bylocator) ‒ 检查⻚⾯的 DOM 上是否存在元素。
urlToBe(java.lang.String url) ‒ 检查当前⻚⾯的 URL 是⼀个特定的 URL

 使用:

  WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
        boolean ispass = wait.until(ExpectedConditions.textToBe(By.cssSelector("#s-top
                left > a:nth - child(1) "), " 新闻 "));
        if (ispass) {
            System.out.println("测试通过");
        } else {
            System.out.println("测试失败");
        }
优点:显⽰等待是智能等待,可以⾃定义显⽰等待的条件,操作灵活
缺点:写法复杂

6.浏览器导航

 6.1打开⽹站

// 更⻓的⽅法
driver.navigate().to( "https://selenium.dev" );
// 简洁的⽅法
driver.get( "https://selenium.dev" );

6.2浏览器的前进、后退、刷新 

driver.navigate().back();
driver.navigate().forward();
driver.navigate().refresh();

使用案例:

  //浏览器导航
    void test02() throws InterruptedException {
        createDriver();
        //找到输入框,并输入关键词:假面骑士
        driver.findElement(By.cssSelector("#kw")).sendKeys("假面骑士");
        Thread.sleep(2000);
        //找到百度一下按钮,并点击
        driver.findElement(By.cssSelector("#su")).click();
        Thread.sleep(2000);
        driver.navigate().back();
        Thread.sleep(2000);
        driver.navigate().forward();
        Thread.sleep(2000);
        driver.navigate().refresh();
        Thread.sleep(2000);
        driver.quit();
    }


7.弹窗

弹窗是在⻚⾯是找不到任何元素的,这种情况怎么处理?使⽤selenium提供的Alert接⼝

Alert alert = driver.switchTo.alert();
//向弹窗的输入框中输入
alert.sendKeys("hello");
//确认
alert.accept();
//取消
alert.dismiss();

8.⽂件上传 

点击⽂件上传的场景下会弹窗系统窗⼝,进⾏⽂件的选择。 selenium⽆法识别⾮web的控件,上传⽂件窗⼝为系统⾃带,⽆法识别窗⼝元素 。但是可以使⽤sendkeys来上传指定路径的⽂件,达到的效果是⼀样的
如:
WebElement ele = driver.findElement(By.cssSelector("body > div > div > input[type=file]"));
ele.sendKeys("D:\\selenium2html\\selenium2html\\upload.html");

9.浏览器参数设置  

9.1无头模式

可以避免打开浏览器,节省资源

//设置无头模式

// options.addArguments("-headless");

9.2浏览器加载策略

1.normal:等待整个页面加载完毕再开始执行操作
2.eager:等待整个dom树加载完成,即DOMContentLoaded这个事件完成,也就是只要HTML 完全加载和解析完毕就开始执行操作。放弃等待图片、样式、子帧的加载。
3.none:等待html下载完成,哪怕还没开始解析就开始执行操作。 

//浏览器加载策略

// options.setPageLoadStrategy(PageLoadStrategy.NORMAL);

options.setPageLoadStrategy(PageLoadStrategy.EAGER);

// options.setPageLoadStrategy(PageLoadStrategy.NONE);


以上为我个人的小分享,如有问题,欢迎讨论!!! 

都看到这了,不如关注一下,给个免费的赞 


http://www.kler.cn/a/571192.html

相关文章:

  • pnpm+monorepo实现前端公共函数、组件库
  • 芯麦 GC1272 芯片:电脑散热风扇领域的高效替代之选,对比 APX9172/茂达芯片优势解析
  • Linux基础 -- ARM 32位常用机器码(指令)整理
  • Deepseek的底层架构思维构成
  • 面试-----每日一题
  • android13打基础: 接收自定义广播并在接收到广播时触发设备震动
  • 3月4日C高级
  • 通往 AI 之路:Python 机器学习入门-线性代数
  • ffmpeg 添加字幕subtitles绝对路径
  • Servlet理论和tomcat(2)http
  • 制服小程序的“滑手”:禁用页面左右滑动全攻略
  • leetcode112-路径总和
  • 练习题:66
  • Python 矩阵对角线操作函数介绍
  • 音频3A测试--AEC(回声消除)测试
  • 什么是线性代数
  • 2025机械考研复试面试问题汇总篇(含13门科目),考研机械复试专业面试常见重点问题总结!考研机械复试专业面试准备看这一篇就够了!
  • 爬虫Incapsula reese84加密案例:Etihad航空
  • 【科研绘图系列】R语言绘制数值的美国地图(USA map)
  • 华为hcia——Datacom实验指南——配置手工模式以太网链路聚合