WEB自动化入门介绍(建议收藏)

一、概念:

什么是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)

行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。

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

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值