Bootstrap

自动化01

测试用例的万能公式:功能测试+界面测试+性能测试+易用性测试+安全性测试+兼容性测试

自动化的主要目的就是用来进行回归测试

新产品--第一个版本 (具备丰富的功能),将产品的整体进行测试,人工创造一个自动化测试用例,在n个版本的时候,在进行测试的时候,只需要应用之前的测试化用例即可测出历史的功能是否达标,然后将原来的测试话用例和新的测试化用例相结合以此完成回归测试

手工测试仍然占主导地位

自动化测试只是测试工作中的一小部分测试行为

对于中大型企业来说自动化测试是必不可少的一部分!!

我们平时认为

自动化:模拟人的行为执行一系列的操作

手工测试:找到浏览器软件,鼠标点击启动手工驱动
自动化测试:驱动--打开浏览器

不同的浏览器需要不同的浏览器驱动,而不同版本的浏览器也需要不同版本的驱动~

在后端test中创建两个类,在pom文件中导入webdrivermanager,selenium,以此来进行操作,然后在代码中引入驱动,进行想要的搜索

import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

public class FristTest {
    //测试百度搜索关键词;迪丽热巴
    void test01() throws InterruptedException {
        //1. 打开浏览器 使用驱动来打开
        WebDriverManager.chromedriver().setup();
        //增加浏览器配置:创建驱动对象要强制指定允许访问所有的链接
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");

        WebDriver driver = new ChromeDriver(options);
        Thread.sleep(3000);

        //2. 输入完整的网址:https://www.baidu.com
        driver.get("https://www.baidu.com");
        Thread.sleep(3000);

        //3. 找到输入框,并输入关键词:迪丽热巴
        driver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");
        Thread.sleep(3000);

        //4. 找到百度一下按钮,并点击
        driver.findElement(By.cssSelector("#su")).click();
        Thread.sleep(3000);

        //5. 关闭浏览器
        driver.quit();
    }
}

如何选中前端中cssSelector和xpath等元素

点击页面中的元素

右键点击选中的元素

复制selector即可

百度输入框id选择器:#kw    xpath: //*[@id="kw"]

获取HTML页面所有的节点
//*
获取HTML页面指定的节点

/ /[指定节点]

获取一个节点中的直接子节点

/

获取一个节点的父节点

..

实现节点属性的匹配

[@...]

 看报错的时候要看

 登陆状态下和非登陆状态下自动化打开的页面不一定相同,因为在做自动化测试一定要注意页面状态的一致性

findElement(By)在页面查找元素,返回值 WebElement
findElements (By)在页面查找元素,返回值为List<WebElement>

点击/提交对象

click()

除了按钮之外,页面的绝大多数元素都可以点击页面隐藏的标签、不可见的标签就不能点击

模拟按键输入

SendKeys("")

清除文本内容
输入文本后又想换一个新的关键词,这里就需要用clear()

获取文本信息
如果判断获取到的元素对应的文本是否符合预期呢?获取元素对应的文本并打印一下~~
获取文本信息:getText()
如果是在input中的value那么应该用getAttribute (String)
String txt = driver.findElement(By.cssSelector("#su")).getAttribute( name: "value");
System.out.printLn("百度一下按钮上的文字为:"+txt);

获取当前页面标题
getTitle()

获取当前页面URL
getCurrentUrl()
 //窗口最大化
driver.manage().window() .maximize();
//窗口最小化
driver.manage().window().minimize();
//全屏窗口
driver.manage().window() .fullscreen()
//手动设置窗口大小
driver.manage().window().setSize(new Dimension(1024,768));

切换标签页
1)获取当前页面句柄:
driver.getWindowHandle();返回值:String
3)获取所有页面句柄:
driver.getwindowHandles()
切换句柄
driver.switchTo().window(w) ;

屏幕截图

File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(srcFile,new File( "my.png"));

假设我们要选择一个

 

./src/test/image/2024-07-17/test01-174530.png的日期,那么我们要注意的一点是在日期和时间中间要加入/否则会出现错误

 //进阶版本的屏幕截图
    void getScreenShot(String str) throws IOException {
        //屏幕截图
        SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");

        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));
    }

初次之外还要记录毫秒,否则会出现文件由于名字相同代替的情况。

driver.close()://关闭当前的标签页
driver. quit O ://关闭浏览器、释放driver对象

自动化代码出现了NoSuchElement错误怎么办

第一步:在报错的代码前添加Thread.sleep(秒),设置的时间长一点
第二步:执行自动化,在自动化打开的页面里打开前端开发者工具,手动检查元素是否真的不存在
1)自动化打开的页面确实不存在该元素
        -手动打开的页面和自动化打开的页面不一样(很可能是登陆和未登录状态下页面不一样,元素为动态元素

2)自动化打开的页面确实存在该元素
        代码执行的速度比页面渲染的速度要快,页面还没渲染出来,程序已经开始找到了,导致元素没有找到
        解决办法----添加等待

等待分为三种

强制等待、隐式等待、显式等待

强制等待
 Thread. sleep (秒)

优点:写法简单,好理解,直接阻塞程序
缺点:极大的增加了自动化的执行时间

隐式等待

implicitlvwait

driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));

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

隐式等待是全局的,在哪里定义都可以

优点:智能等待,作用于全局缺点:只能查找元素、每次查找元素都要等待

在测试中,可能会出现程序运行太快导致其他操作没有完成导致直接结束,我们可以用这样的方法防止出现这样的情况

显式等待

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

newWebDriverWait(driver,Duration.ofSeconds(3)).until($express)

 elementToBeClickable(Bylocator))-用于检查元素的期望是可见的并已启用,以便您可以单击它。
textToBe(Bylocator,String str)-检查元素。(精确匹配)
presenceofElementLocated(Bylocator)-检查页面的DOM上是否存在元素。
urlToBe(java.lang.String url)」-检查当前页面的URL是一个特定的URL。

driver.navigate() .back() ; 返回
driver.navigate() .forward();前进
driver.navigate().refresh() ;刷新

 

;