python入门系列二十三(Selenium,自动化测试利器)

187 阅读4分钟

1.引言

前两天有朋友过来问,说团队测试人员工作负荷太高了,人手不够,从技术维度上有没有什么解决方案?我给推荐了Selenium,做自动化测试吧。即便前期有一定投入成本,考虑到后续收益是可以接受的。

那么今天这篇文章,我顺带分享关于Selenium的入门级操作,通过一篇文章搞清楚Selenium是什么,以及可以做什么。

Selenium官方地址:www.selenium.dev/documentati…

image.png

根据官方文档介绍,我们看到Selenium是一个浏览器自动化操作项目,或者更直白一些它是Web应用自动化测试工具套件

  • 支持语言丰富:java,python,c#,ruby,javaScript,kotlin
  • 支持主流浏览器:chrome,firefox,edge,safari
  • 跨平台:windows,linux,macos

你看到了,不管是什么操作系统平台,不管是你喜欢什么浏览器,都满足!那么在以下实际应用场景中,Selenium都给我们带来了工程实践价值:

  • 自动化测试,降本增效
  • 爬虫,模拟各种浏览器操作,什么繁琐逆向js,验证码,动态请求分析,都不需要!

2.案例

2.1.环境准备

使用selenium操作浏览器,需要配套下载目标浏览器的驱动,selenium本质上是浏览器工具集套件,真正驱动浏览器的是驱动。

以下是三大主流浏览器驱动下载地址:

我们根据浏览器版本,下载相应的驱动版本,我这里以chrome浏览器为示例。

我的chrome浏览器版本:

image.png

插件相应版本:

image.png

image.png

本地存放路径:

image.png

2.2.java入门示例

2.2.1.应用需求

我这里的示例应用需求,访问百度:www.baidu.com网站,找到输入框,输入搜索关键词:Selenium,然后执行百度搜索,并提取搜索结果,通过断言判断实现一个最简单的自动化测试用例。

image.png

2.2.2.创建项目,添加依赖

项目结构是标准springboot应用,maven构建工具管理依赖:

image.png

selenium maven依赖:

image.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>
    <packaging>jar</packaging>

    <!--父级项目-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.edu.selenium</groupId>
    <artifactId>edu-selenium</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!-- 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>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

</project>

2.2.3.脚本代码

代码中我配套写了详细的注释,都比较简单,相信做过java开发的朋友看起来不会有什么困难。

package cn.edu.selenium.hello;

import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

import java.util.concurrent.TimeUnit;

@Slf4j
public class HelloSelenium {

    public static void main(String[] args) {
        //System.setProperty("webdriver.chrome.driver", "D:\\03other\\pycharmProjects\\chromedriver-win64\\chromedriver.exe");
        System.setProperty("webdriver.chrome.driver", "D:\\03other\\pycharmProjects\\chromedriver-win64\\chromedriver-win64\\chromedriver.exe");
        //初始化一个chrome浏览器实例,实例名称叫driver
        WebDriver driver = new ChromeDriver();
        //最大化窗口
        driver.manage().window().maximize();
        //设置隐性等待时间
        driver.manage().timeouts().implicitlyWait(8, TimeUnit.SECONDS);

        // get()打开一个站点
        driver.get("https://www.baidu.com");

        //判断title是不是 百度一下,你就知道
        try{
            String baidu_title = "百度一下,你就知道";
            assert baidu_title.equals(driver.getTitle());
            log.info("Test Pass");

        }catch(Exception e){
            e.printStackTrace();
        }

        //搜索输入框输入Selenium
        driver.findElement(By.id("kw")).sendKeys("Selenium");

        //点击百度一下按钮
        driver.findElement(By.id("su")).click();

        //设置隐性等待时间
        driver.manage().timeouts().implicitlyWait(8, TimeUnit.SECONDS);

        // 这里通过元素XPath表达式来确定该元素显示在结果列表,从而判断Selenium官网这个链接显示在结果列表。
        WebElement ele_string=driver.findElement(By.xpath("//*[@id=\"9\"]/div[1]/div[1]/div[1]/h3/a/em"));


        String ele_string1 = ele_string.getText();
        log.info(ele_string1);

        try{

            if(ele_string1.equals("Selenium")){

                log.info("Testing is successful!");

            }
        }catch(Exception e){
            e.printStackTrace();
        }

        //关闭并退出浏览器
        driver.quit();

    }
}

2.2.4.浏览器自动操作

image.png

2.2.5.控制台输出

image.png

2.3.python入门示例

2.3.1.安装selenium库

使用python操作selenium,需要安装selenium库

 pip install selenium==4.6.1

2.3.2.脚本代码

代码与java版本整体一致,仅仅是不同语言版本api方法上的差异,看起来都比较简单。

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

if __name__ == '__main__':

    driverPath = "D:/03other/pycharmProjects/chromedriver-win64/chromedriver-win64/chromedriver.exe"
    browser = webdriver.Chrome(driverPath)

    # 最大化窗口
    browser.maximize_window()

    # 设置隐性等待时间
    time.sleep(5)

    # get()打开一个站点
    browser.get("https://www.baidu.com")
    try:
        # 判断title是不是 百度一下,你就知道
        baidu_title = "百度一下,你就知道"
        assert baidu_title==browser.title
        print("Test Pass: " + browser.title)
    except Exception as e:
        print(e)

    # 搜索输入框输入Selenium
    browser.find_element(By.ID,"kw").send_keys("Selenium")

    # 点击百度一下按钮
    browser.find_element(By.ID,"su").click()

    # 设置隐性等待时间
    time.sleep(8)

    # 这里通过元素XPath表达式来确定该元素显示在结果列表,从而判断Selenium官网这个链接显示在结果列表。
    ele_string = browser.find_element(By.XPATH,"//*[@id=\"9\"]/div[1]/div[1]/div[1]/h3/a/em")

    ele_string1 = ele_string.text
    print(ele_string1)
    try:
        if ele_string1=="Selenium":
            print("Testing is successful!")
    except Exception as e:
        print(e)

    # 关闭并退出浏览器
    browser.quit()

2.3.3.执行结果

浏览器:

image.png

控制台:

image.png