zl程序教程

您现在的位置是:首页 >  其他

当前栏目

【2023最全教程】WEB自动化入门介绍(建议收藏)

教程Web自动化入门 介绍 建议 收藏 2023
2023-09-11 14:14:52 时间

一、概念:

什么是web自动化测试?

把以人为驱动的测试行为转化为机器执行的过程,通过测试工具录制软件或编写脚本,对web对象进行输入数据,单击等操作,比较预期结果和实际结果,产出测试报告。

web自动化的范畴:

UI层的黑盒测试

什么样的项目适合做web自动化测试?

  1. web界面稳定,变动少
  2. 项目维护周期长
  3. 频繁的回归测试
  4. 项目进度压力不大
  5. 被测系统开发较为规范,具备可测试性
  6. 测试人员具有一定的编程能力

自动化的作用

  1. 能代替人解决繁琐的回归测试,提高效率
  2. 自动化测试脚本设计一次能重复运行
  3. 执行结果高度一致,避免人为的出错
  4. 可以实现自动或者定时执行测试

前期知识积累:

Python-Pytest-Allure

PageObject设计概念

模块驱动、数据驱动、关键字驱动概念

HTML:知道标签的含义,如何确定元素的绝对路径,识别并切换iframe等

Xpath、CSS:元素定位语句

JavaScript、jQuery

 

二、环境搭建(mac)【文末免费分享WEB自动化测试配套资源】

依赖:

  • Python3
  • Pycharm
  • Chrome
  • Selenium3
  • ChromeDriver
  • Pytest
  • Allure

安装:

  • selenium

  • ChromeDriver下载,选择对应版本

chromedriver.storage.googleapis.com/index.html

  • 将下载好的chromedriver移到 /usr/local/bin 目录下

验证:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# @Time : 2021/1/7 20:30

# @Author : jlyu

# @File : test.py



from selenium import webdriver



# 打开chrome浏览器

driver = webdriver.Chrome()

# 访问百度首页

driver.get("http://www.baidu.com")
复制代码

效果:

三、元素定位

元素定位是很重要的一个环节,想要对页面进行操作,首先得定位到要操作的元素,然后才能发送指令。利用Chrome的控制台可以查看页面元素,每个元素有对应的标签名、属性和层级关系

一个快速找到组件相关属性的技巧:

封装的一些元素查找方法:

if by == 'xpath':

    elements = self.driver.find_element_by_xpath(element_by)

elif by == "css":

    elements = self.driver.find_element_by_css_selector(element_by)

elif by == 'id':

    elements = self.driver.find_element_by_id(element_by)

elif by == 'classname':

    elements = self.driver.find_element_by_class_name(element_by)

elif by == 'name':

    elements = self.driver.find_element_by_name(element_by)

elif by == 'text':

    elements = self.driver.find_element_by_link_text(element_by)

else:

    return None
复制代码

对应的查找方式:

driver.find_element_by_xpath("//input[@id='su']") # 查找tag为input,id为su的元素

driver.find_element_by_css_selector("#su")  # id为su的元素

driver.find_element_by_id("su")  # id为su的元素

driver.find_element_by_class_name("btn self-btn bg s_btn")  # 定位失败,因为name不唯一

driver.find_element_by_link_text("百度一下")  # 定位失败,因为text不唯一

driver.find_element_by_xpath("/html/body/div/div[2]/div[5]/div[1]/div/form/span[2]/input") # 绝对路径
复制代码

定位技巧:通过CSS和Xpath语法定位,有id属性的,优先使用id定位,其次是name、text等属性。不推荐绝对路径查找,一是层级太多查找麻烦,二是受页面变动影响大,不易维护。某个元素没有属性时,可以先通过父节点或兄弟节点定位到最近一级,再通过层级关系来定位。

四、WebDriver介绍

WebDriver官方说明:

 """

Controls a browser by sending commands to a remote server.

This server is expected to be running the WebDriver wire protocol

as defined at

https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol



 :Attributes:

 - session_id - String ID of the browser session started and controlled by this WebDriver.

 - capabilities - Dictionaty of effective capabilities of this browser session as returned

 by the remote server. See https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities

 - command_executor - remote_connection.RemoteConnection object used to execute commands.

 - error_handler - errorhandler.ErrorHandler object used to handle errors.

 """
复制代码

web自动化测试工具-Selenium

主流的一些测试工具有Selenium、AutoRunner、Robot Framework、UTF。

Selenium是一个用于Web应用程序的开源自动化测试工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作浏览器一样,支持的浏览器包括IE,Firefox,Safari,Chrome等。Selenium 不仅仅是一个工具或 API,它还包含了一些组件:Selenium WebDriver(驱动)、Selenium IDE(录制)、 Selenium Gird(分布式)

不支持在 Docs 外粘贴 block

elememt.click()代码对应的请求链接(post):

http://127.0.0.1:4444/wd/hub/session/277e823a-8be2-48eb-9001-971cc1bff9c4/element/1/click

点击操作执行成功后返回的信息:

{

"status": 0,

"sessionId": "277e823a-8be2-48eb-9001-971cc1bff9c4",

"state": "success",

"value": null,

"class": "org.openqa.selenium.remote.Response",

"hCode": 11068806

}
  • 浏览器相关操作api:

driver.get("http://www.baidu.com")  # 打开浏览器并访问该地址

driver.maximize_window()  # 是浏览器全屏

driver.set_window_size(100, 200)  # 设置浏览器窗口大小

driver.get_window_size()  # 获取浏览器窗口大小

driver.current_window_handle()  # 获取当前窗口的句柄

driver.window_handles()  # 获取所有窗口句柄

driver.refresh()  # 刷新当前页面

driver.forward()  # 当前页面前进

driver.back()  # 当前页面后退

driver.get_screenshot_as_file("xxx.png")  # 截图并保存

driver.get_cookie("cookieKey")  # 获取cookie信息

driver.add_cookie({'name': 'jl', 'value': '123123123'})  # 添加cookie

driver.delete_cookie("jl")  # 删除cookie

driver.switch_to.frame()  # 切换iframe

driver.switch_to.alert()  # 切换到警告弹窗

widows_handle = driver.current_window_handle  # 获取标签页句柄

driver.switch_to.window(widows_handle)  # 切换标签页

driver.close()  # 关闭当前页面

driver.quit()  # 关闭浏览器并退出驱动
复制代码
  • 元素相关操作api:

driver.find_element_by_id("su").click()  # 点击元素

driver.find_element_by_id("kw").send_keys()  # 输入文本内容

driver.find_element_by_id("kw").clear()  # 清除文本框内容

driver.find_element_by_id("su").submit()  # 提交表单

driver.find_element_by_id("kw").is_displayed()  # 判断元素是否存在

driver.find_element_by_id("kw").is_selected()  # 判断元素是否已被勾选

driver.find_element_by_id("kw").is_enabled()  # 判断元素的可编辑状态

driver.find_element_by_id("kw").get_property("kw")  # 获取元素属性

driver.implicitly_wait(1)  # 智能等待元素出现

tag_name = driver.find_element_by_id("kw").tag_name  # 获取元素的名字

element_size = driver.find_element_by_id("kw").size  # 获取元素的宽和高

text = driver.find_element_by_id("su").text  # 获取元素的文本内容

location = driver.find_element_by_id("kw").location  # 获取当前元素的坐标
复制代码

五、实战

以百度网页的登录、搜索内容、修改网页配置为测试用例

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# @Time : 2021/1/8 19:34

# @Author : jlyu

# @File : test_baidu.py



import time



import allure



from selenium import webdriver

from selenium.webdriver.common.action_chains import ActionChains



username = ""  # 输入百度用户名

password = ""  # 输入百度账号密码

cookies = {}  # 百度网页登录成功后的cookies



class TestBaidu:

    """

 百度相关的WEB自动测试用例,用于演示

 """



 @allure.title('登录用例')

    def test_login(self):

        print("开始登录用例")

        driver = webdriver.Chrome()

        driver.get("https://www.baidu.com/")

        driver.find_element_by_css_selector('#u1>a').click()

        driver.implicitly_wait(30)

        driver.find_element_by_id('TANGRAM__PSP_11__footerULoginBtn').click()

        driver.find_element_by_id('TANGRAM__PSP_11__userName').send_keys(username)

        time.sleep(3)

        driver.find_element_by_id('TANGRAM__PSP_11__password').send_keys(password)

        time.sleep(3)

        driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_11__submit"]').click()

        time.sleep(3)



        for cookie in cookies:

            cookie_dict = {

                "domain": ".baidu.com",

                'name': cookie.get('name'),

                'value': cookie.get('value'),

                "expires": "",

                'path': '/',

                'httpOnly': False,

                'HostOnly': False,

                'Secure': False

            }

            driver.add_cookie(cookie_dict)

        driver.refresh()  # 添加cookies后需要刷新一下网页

        user_name = driver.find_element_by_css_selector('#s-top-username>span.user-name.c-font-normal.c-color-t').text  # 获取登录后的用户名

        assert user_name == username  # 判断登录是否成功

        time.sleep(3)

        driver.quit()



    @allure.title("搜索用例")

    def test_search(self):

        print("开始搜索用例")

        driver = webdriver.Chrome()

        driver.get("https://www.baidu.com/")

        for cookie in cookies:

            cookie_dict = {

                "domain": ".baidu.com",

                'name': cookie.get('name'),

                'value': cookie.get('value'),

                "expires": "",

                'path': '/',

                'httpOnly': False,

                'HostOnly': False,

                'Secure': False

            }

            driver.add_cookie(cookie_dict)

        driver.refresh()

        driver.find_element_by_id('kw').send_keys("selenium")

        time.sleep(3)

        driver.find_element_by_id('su').click()

        time.sleep(3)



    @allure.title("修改搜索结果显示条数用例")

    def test_logout(self):

        print("开始修改搜索结果显示条数用例20条")

        driver = webdriver.Chrome()

        driver.get("https://www.baidu.com/")

        for cookie in cookies:

            cookie_dict = {

                "domain": ".baidu.com",

                'name': cookie.get('name'),

                'value': cookie.get('value'),

                "expires": "",

                'path': '/',

                'httpOnly': False,

                'HostOnly': False,

                'Secure': False

            }

            driver.add_cookie(cookie_dict)

        driver.refresh()

        setting_element = driver.find_element_by_id('s-usersetting-top')

        ActionChains(driver).move_to_element(setting_element).perform()

        time.sleep(0.5)

        search_setting = driver.find_element_by_link_text("搜索设置")

        ActionChains(driver).move_to_element(search_setting).perform()

        search_setting.click()

        time.sleep(3)

        choice = driver.find_element_by_name("NR")

        choice.find_element_by_xpath('//*[@id="nr_2"]').click()

        time.sleep(3)

        driver.find_element_by_css_selector('#se-setting-7>a.prefpanelgo.setting-btn.c-btn.c-btn-primary').click()

        time.sleep(3)

        driver.switch_to.alert.accept()

        time.sleep(3)

        driver.find_element_by_id('kw').send_keys("selenium")

        driver.find_element_by_id('su').click()

        time.sleep(3)



    def test_failcase(self):

        print("一个失败的用例,用于观察报告")

        assert 1 == 2





if __name__ == "__main__":

    # test_baidu = TestBaidu()

    # test_baidu.test_logout()



    os.system("pytest -s -q  --alluredir=../report/allure-json --clean-alluredir")  # test_baidu.py::TestBaidu::test_failcase

    os.system("allure generate ../report/allure-json -o ../report/allure-report --clean")

    os.system("allure open /Users/bytedance/PycharmProjects/DPWebTest/report/allure-report)

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助……如果你不想再体验一次自学时找不到资料,没人解答问题,坚持几天便放弃的感受的话,可以加入下方我们的测试交流群大家一起讨论交流学习。