【测试开发篇7】web自动化--selenium音标: [sɪˈliːnɪəm]

目录

一、认识自动化测试 

Ⅰ为什么要做自动化测试

Ⅱweb自动化为什么选择selenium(4个主要原因)

①开源免费

②支持多浏览器

③支持多语言

④包底层有很多API

 Ⅲ下载浏览器驱动

Ⅳ驱动的工作原理

selenium、驱动、浏览器三者之间的关系

二、使用selenium进行测试的步骤(第一个selenium测试程序)

第一步:新建一个maven项目,并且添加依赖:

 第二步:新建一个测试类(FirstTest)

第三步:运行程序,观察结果

三、selenium的基本语法

第一步:新建一个类(WebTest1),并且明确使用哪一个浏览器的驱动

第二步:编写一个退出测试(quit)的方法

第三步:在开始和结束之间,编写定位元素的方法(locateTest)并在里面编写选择器定位

①CSS选择器定位

②xpath定位选择器

Xpath选择器和CSS选择器有什么不一样

区别1:CSS查找效率更高,Xpath效率低一些;

区别2:Xpath的功能更强大

第四步:在locateTest方法内部编写元素的操作

A.click():点击

B.submit():提交

​编辑

submit和click的区别 

C.send_keys 

D.清除(clear) 

E.获取文本getTest()

F.获取属性getAttribute()

总结:

测试类整体代码:

常见等待机制

为什么要有等待的机制?

1、强制等待

2、隐式等待

3、显示等待

 三种等待方式总结:

什么时候使用接口测试,什么时候使用自动化测试?

       接口测试:

       自动化测试:


一、认识自动化测试 

Ⅰ为什么要做自动化测试

       自动化测试可以代替一部分的手工测试,可以提高测试的效率

       在这一篇文章当中,我们提到了:

       当进行回归测试的时候,也就是对于历史的版本历史的功能进行测试。

       但是,当版本越来越多功能越来越多的时候,那么也就需要借助自动化测试来进行回归测试了,它可以代替部分手工测试。


Ⅱweb自动化为什么选择selenium(4个主要原因)

①开源免费

这是一个开源免费的工具

②支持多浏览器

火狐(fire fox)、chrome、IE、edge、Safari

③支持多语言

如:Java、python等等。

④包底层有很多API

这些API可以很方便使用,方便调用进行测试。


 Ⅲ下载浏览器驱动

步骤1:查看edg浏览器的版本(如果有安装)

 在下载之前,首先需要查看自己的edg浏览器的版本。


步骤2:点击下面的链接,下载对应的版本

Microsoft Edge WebDriver - Microsoft Edge Developer


步骤3:在这个界面往下拉动,找到如下界面

下载对应的32/64位的内容即可。


步骤4: 

下载好之后,找到一个安装包,然后找到里面的exe文件。

步骤5:

把这个exe文件放到jdk的bin目录下面


Ⅳ驱动的工作原理

对于自动化测试来说,代码不可以直接打开浏览器,因此我们需要借助驱动程序来打开浏览器。

selenium、驱动、浏览器三者之间的关系


二、使用selenium进行测试的步骤(第一个selenium测试程序)

第一步:新建一个maven项目,并且添加依赖:

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.0.0</version>
        </dependency>

 第二步:新建一个测试类(FirstTest)

 在这个类当中新建一个方法,并且输入以下的内容。

 public void baiduTest() throws InterruptedException {
        //创建一个驱动对象
        EdgeDriver driver=new EdgeDriver();
        Thread.sleep(3000);
        //输入待测试的网址
        driver.get("https://www.baidu.com");
        Thread.sleep(3000);
        //找到搜索输入框,并且在sendKey当中发送内容
        driver.findElement(By.cssSelector("#kw")).sendKeys("hello test!");
        Thread.sleep(3000);
        //找到"百度一下"的按钮,然后发送
        driver.findElement(By.cssSelector("#su")).click();
        Thread.sleep(3000);
        driver.quit();
    }

 通过其他类调用这个buildTest方法

public class RunAutoTest {

    public static void main(String[] args) throws InterruptedException {
            
            FirstAutoTest firstAutoTest=new FirstAutoTest();
            firstAutoTest.baiduTest();
    }
}

现在,就可以正常使用了。


第三步:运行程序,观察结果

可以看到,即使什么也没有做,直接运行程序,也可以正常运行。


三、selenium的基本语法

第一步:新建一个类(WebTest1),并且明确使用哪一个浏览器的驱动

   /**
    * 此处的浏览器为edge浏览器
    */
    private EdgeDriver driver=new EdgeDriver();

    public void startTest(){
        //通过get方法访问到这一个网址
        driver.get("https://www.baidu.com");
    }

第二步:编写一个退出测试(quit)的方法

需要在这个方法当中释放驱动对象。

    /**
     * 释放驱动,退出浏览器
     */
    public void endTest(){
        //释放驱动的对象
        driver.quit();
    }

第三步:在开始和结束之间,编写定位元素的方法(locateTest)并在里面编写选择器定位

①CSS选择器定位

首先,需要找到指定的页面(例如www.baidu.com)

假如此时我想定位的元素为下图红框当中的元素"新闻":  

然后,按住fn+f12,打开开发者工具,点击"元素"

然后右键这个URL,选择:复制selector。下图内容就是复制的元素:


最后,调用driver的findElement方法,通过By这个抽象类传入参数:

   /**
     * 定位元素的方法
     */
    public void locateTest(){
        //By的方法传入的参数为edge浏览器对应的选择器(selector)
        //返回的参数为这个链接对应的文本名称,类型为String
        String test=driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).getText();
        //输出内容为选择器对应的文本
        System.out.println(test);
    }

②xpath定位选择器

       跟CSS选择器类似,只需要右键标签,然后选择复制-->复制xpath。即可复制标签的xpath内容,完成定位。

       然后通过下面的方式:

 String test= driver.findElement(By.xpath("xpath的内容")).getText();

 来获取到输出的内容。


Xpath选择器和CSS选择器有什么不一样

区别1:CSS查找效率更高,Xpath效率低一些;

        原因:css和html是捆绑在一起的,换成XML和其他的标记语言,就不一样了;而Xpath和DOM是绑定在一起的(DOM是html和js的中介);


区别2:Xpath的功能更强大

例如:

①Xpath在找到一个元素之后可以上下移动的;

②CSS不支持text文本定位,但是Xpath支持文本定位。


第四步:在locateTest方法内部编写元素的操作

       在①和②当中,都是定位到对应的元素(findElement),例如获取到输入框/获取到标签之类的。获取到之后,如果要对它进行一些操作,(例如输入内容,发送消息)等等,就需要涉及到下面的:对于元素(selment)的一系列操作。

A.click():点击

       点击元素,例如,可以在获取到"新闻"的链接之后,进行点击操作,就可以令浏览器自动点击页面的标签,于是:代码就是下面这样编写:  

 /**
     * 定位元素的方法
     */
    public void locateTest() throws InterruptedException {
        //By的方法传入的参数为edge浏览器对应的选择器(selector)
        //获取到这一个元素:WebElement
        WebElement element1=driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)"));
        //点击这个元素
        element1.click();
        Thread.sleep(3000);
    }


B.submit():提交

这个操作也可以操作按钮。

首先 :需要找到输入框对应的CSS选择器。然后调用sendKeys往输入框当中输入字符串。

然后:找到"百度一下"对应的CSS选择器,模拟提交。

 /**
     * 定位元素的方法
     */
    public void locateTest() throws InterruptedException {
        //submit提交行为
        //找到百度的输入框
        driver.findElement(By.cssSelector("#kw")).sendKeys("hello");
        //此处模拟的是"提交"
        driver.findElement(By.cssSelector("#su")).submit();
    }

submit和click的区别 

可以submit的地方都可以click,但是并不是所有的地方都可以"submit"。


C.send_keys 

模拟按键输入。(也就是往文本框里面输入内容)


D.清除(clear) 

也是需要通过findElement方法获取到对应的元素,然后才可以执行:清空文本框的输入内容。


E.获取文本getTest()

不是说页面上面所有可以看得见的文字,都可以被称之为"文本"。

有一些文字,是input标签的属性值,这个属性值是不可以通过getTest()方法获取到的。

例如:

<input type="text" value="hello">

此时,如果文本输入框当中用户输入了内容,那么getTest()才会获取到输入的内容。

如果文本框当中,没有输入的内容,那么调用getTest()方法也无法获取到文本。


当然,大部分的超链接内容,都不一定视为文本。 


F.获取属性getAttribute()

还是上面的那个文本输入框,在getAttribute当中传入name,可以获取到value

  /**
     * 定位元素的方法
     */
    public void locateTest() throws InterruptedException {
        //获取文本的行为
        //获取"百度一下"的文本内容
        //body > input[type=submit]
        String test=driver.findElement(By.xpath("/html/body/input")).getAttribute("value");
        System.out.println(test);


    }

总结:

测试类整体代码:

public class WebTest1 {

    /**
     * 此处的浏览器为edge浏览器
     */
    private final EdgeDriver driver=new EdgeDriver();

    public void startTest(){
        //通过get方法访问到这一个网址
        driver.get("https://www.baidu.com");
    }

    /**
     * 定位元素的方法
     */
    public void locateTest() throws InterruptedException {
        //设置最大的等待时间
        //如果在这个等待的时间内(下面是秒)
        //没有找到下面两个元素,那么直接抛出noSuchElementException
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        //输入待测试的网址
        driver.get("https://www.baidu.com");
        //找到搜索输入框,并且在sendKey当中发送内容
        driver.findElement(By.cssSelector("#kw")).sendKeys("hello test!");
        //找到"百度一下"的按钮,然后发送
        driver.findElement(By.cssSelector("#su")).click();

        //指定等待的时间
        WebDriverWait webDriverWait=new WebDriverWait(driver,Duration.ofSeconds(3));
        //如果寻找的元素没有在指定的时间内
        //那么就抛出异常
        webDriverWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#su")));
    }
    /**
     * 释放驱动,退出浏览器
     */
    public void endTest(){
        //释放驱动的对象
        driver.quit();
    }
}

 以上是常用的测试一个页面所需要的步骤,下面将介绍几种常见的等待机制。


常见等待机制

为什么要有等待的机制?

测试代码执行的速度比较快,而前端页面渲染的速度慢一点,可能导致的结果是:

代码已经执行到下一步了,但是页面还是没有渲染出来。于是就引入了——等待机制。

1、强制等待

 直接在程序当中调用Thread.sleep(timeout)之后就可以了。 

public class WebTest1 {

    /**
     * 此处的浏览器为edge浏览器
     */
    private final EdgeDriver driver=new EdgeDriver();

    public void startTest(){
        //通过get方法访问到这一个网址
        driver.get("https://www.baidu.com");
    }

    /**
     * 定位元素的方法
     */
    public void locateTest() throws InterruptedException {
        //获取文本的行为
        //获取"百度一下"的文本内容
        //body > input[type=submit]
        Thread.sleep(3000);
        //输入待测试的网址
        driver.get("https://www.baidu.com");
        Thread.sleep(3000);
        //找到搜索输入框,并且在sendKey当中发送内容
        driver.findElement(By.cssSelector("#kw")).sendKeys("hello test!");
        Thread.sleep(3000);
        //找到"百度一下"的按钮,然后发送
        driver.findElement(By.cssSelector("#su")).click();
        Thread.sleep(3000);
    }


    /**
     * 释放驱动,退出浏览器
     */
    public void endTest(){
        //释放驱动的对象
        driver.quit();
    }

}

 优点:语法简单,适合调用的时候进行调试;

 缺点:需要等待固定的时间,造成测试时间的大量消耗


2、隐式等待

特点1:在规定的时间范围内,轮询等待元素出现之后就立即结束。(相当于不停刷新浏览器)

特点2:如果在规定的时间内元素仍然没有出现,那么就会抛出noSuchElement异常。

特点3:一旦设置了等待时间,那么它将作用于整个driver的生命周期

特点4:只有所有元素都出现之后,才会进行下一步的操作

        //设置最大的等待时间

        //如果在这个等待的时间内(下面是秒)

        //没有找到下面两个元素,那么直接抛出noSuchElementException
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));

优点:节省了大量的等待时间,元素展示之后就可以直接执行下一步了。

缺点:只有等待所有的元素都渲染完成之后,才会进行下一步操作


3、显示等待

       可以针对某一个元素进行等待。不用像显示等待一样必须要等到下一个元素出现才能查找再下一个元素

//指定等待的时间
WebDriverWait webDriverWait=new WebDriverWait(driver,Duration.ofSeconds(3));

//如果没有在指定的时间内寻找到元素
//那么就抛出异常
webDriverWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#su")));

       优点:不用像显示等待那样等待上一个元素出现才继续查找下一个元素。可以指定某一个元素进行等待,降低了自动化测试整体的等待时间。

       缺点:写法比较复杂。


 三种等待方式总结:


什么时候使用接口测试,什么时候使用自动化测试?

接口测试和自动化测试都是软件测试中常用的测试方法。以下是它们的适用场景:

       接口测试:

       接口测试主要用于测试不同组件之间的交互是否正确,通常用于测试API、微服务等。当开发团队在独立开发组件时,接口测试可以确保这些组件能够在一起协同工作,以构建稳定和可靠的系统。

       自动化测试:

       自动化测试主要用于执行大量的重复测试任务,以减少测试时间和测试成本,并提高测试的准确性和可重复性。当需要在短时间内频繁地运行相同的测试用例时,自动化测试是最好的选择。它可以在快速迭代的开发周期中确保软件质量,并且可以在更广泛的环境中覆盖更多的测试用例。

       在实际项目中,接口测试和自动化测试通常是相辅相成的,两者可以一起使用来确保软件的质量和稳定性。例如,可以使用接口测试来确保各个组件的正确交互,然后使用自动化测试来执行大量的回归测试,以确保在迭代中添加新功能时不会破坏现有的功能。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值