测试分类:
按开发阶段:单元、继承、系统、验收测试
按是否查看代码:黑盒、白盒、灰盒
按是否运行:静态、动态
按测试对象:性能、安全、兼容性、文档、用户体验、业务、界面、安装、内存泄漏
按测试实施的组织:a、b、第三方
按是否手工执行:手工、自动化
其他分类:冒烟、回归
selenium三剑客: selenium webdriver:客户端API,测试人员通过调用这些接口访问浏览器驱动,浏览器驱动再访问浏览器
selenium ide:浏览器插件
selenium grid:大型项目测试,进行分布式扩容
selenium用于web应用程序自动化测试工具,直接运行在浏览器中,就像真正用户在操作一样。
特点:
开源、免费
多浏览器支持
多平台支持
多语言支持
支持分布式测试(使用selenium grid)
支持录制、回放和脚本生成(使用selenium ide)
驱动安装:
https://chromedriver.storage.googleapis.com/index.html
要对应浏览器的版本
测试:
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome(executable_path=r'H:\mingw\chromedriver_win32.exe')
driver.get('http://www.baidu.com')
sleep(3)
driver.find_element_by_id('kw').send_keys('selenium')
sleep(3)
driver.find_element_by_id('su').click()
sleep(3)
driver.quit()
源码分析:
初始化重点:Service实例化,类似手动:
def test():
import subprocess
p = subprocess.Popen("chromedriver")
p.communicate()
输出:
Starting ChromeDriver 98.0.4758.102 (273bf7ac8c909cde36982d27f66f3c70846a3718-refs/branch-heads/4758@{#1151}) on port 9515 Only local connections are allowed. Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe. ChromeDriver was started successfully.
封装成单元测试:
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
def test(self):
self.driver.get('http://www.baidu.com')
sleep(3)
self.driver.find_element_by_id('kw').send_keys('selenium')
sleep(3)
self.driver.find_element_by_id('su').click()
if __name__ == "__main__":
case = TestCase()
case.test()
selenium实现元素定位
driver.find_element_by_id()
driver.find_element_by_class_name()
driver.find_element_by_css_selector()
driver.find_element_by_link_text()
driver.find_element_by_partial_link_text()
driver.find_element_by_tag_name()
driver.find_element_by_xpath()
driver.find_element_by_name()
driver = webdriver.Chrome(executable_path=r'H:\mingw\chromedriver_win32')
driver.get('http://www.baidu.com')
driver.maximize_window()
sleep(1)
element = driver.find_element_by_id('kw')
element.send_keys('selenium')
print(type(element))
driver.find_element_by_id('su').click()
sleep(3)
集成封装:
def get_element(driver, *loc):
e = driver.find_element(*loc)
return e
if __name__ == "__main__":
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
get_element(driver, By.ID, 'kw').send_keys('selenim')
get_element(driver, By.ID, 'su').click()
selenium webdriver和浏览器通信
对于每一条selenium脚本,创建一个http请求并发送给浏览器驱动
浏览器驱动中包含一个http server,用来接收这些请求
Http server接收到请求后根据请求具体操控对应浏览器
浏览器执行具体测试步骤
浏览器将步骤执行结果返回http server
http server将结果返回给selenium脚本,如果是错误的http代码会在控制台看到对应报错信息
webdriver使用的协议:(为什么可以python也可以java等)
json wire protocol
通信的数据格式是JSON
属性
driver.name
driver.current_url
driver.title
driver.page_source
driver.current_window_handle
driver.window_handles
核心webelement属性
id? ? ? ? ? ? ? ??
size? ? ? ? ? ??
rect
tag_name
text
方法
send_key()
clear()
click()
get_attribute()
is_selected()
is_enabled()
is_displayed()
value_of_css_property()
操作表单
定位表单元素
输入测试值
判断表单元素属性
获取表单元素属性
提交表单进行验证
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
path = os.path.dirname(os.path.abspath(__file__))
file_path = 'file:///'+path+'/forms.html'
self.driver.get(file_path)
def test_login(self):
self.driver.find_element_by_id('username').send_keys('admin')
self.driver.find_element_by_id('pwd').send_keys('123')
self.driver.find_element_by_id('submit').click()
checkbox和radiobutton
def test_checkbox(self):
swimming = self.driver.find_element_by_name('swimming')
if not swimming.is_selected():
swimming.click()
reading = self.driver.find_element_by_name('reading')
if not reading.is_selected():
reading.click()
self.driver.quit()
下拉列表
处理弹框
三种等待方式
|