1.环境搭建
工具:Selenium2.48(pip安装);Webdriver(搜索淘宝NPM进行下载chromedriver)。
驱动:浏览器的版本和驱动版本要一致;Webdriver最好设置为环境变量,或者放在python路径下即可。
2.元素定位
定位方法:id、name、class_name、tag_name、link_text、partial_link_text、xpath、css_selector
如driver.find_element_by_id("userA").send_keys('123')
By类写法:driver.find_element(By.CSS_SELECTOR,'#kw').send_keys("python"),二者底层逻辑一样。
注意点:多个元素是find_elements。
xpath对比css_selector
元素名://input——input
id://input[@id='userA']——@userA
class://*[@class='telA']——.telA
属性: //*[text()= 'xxx']——input[type^='p'];//*[statrswith(@attribute, 'xxx')]——input[type$='d'];//*[contains(@attribute, 'xxx')]——input[type*='w']
3.操作方法
元素方法:clear() 、send_keys()、click()、maximize_window()、size、text、title、current_url、get_attribute()、is_display()、is_enabled()
浏览器方法:set_window_size(100,100)、set_window_position(300,200)、back()、forward()、refresh()、close()、quit()、switch_to.alert
元素等待方法显式等待:element = WebDriverWait(driver,5).until(expected_conditions.presence_of_element_located((By.ID, 'userA')))
隐式等待:implicitly_wait(10)
强制等待:time.sleep(3)
鼠标方法
action=ActionChains(driver)
action.context_click()、double_click()、drag_and_drop()、move_to_element()、-每个动作后都得执行
键盘方法
send_keys(Keys.BACK_SPACE)、Keys.SPACE、Keys.TAB、Keys.ESCAPE、Keys.ENTER、Keys.CONTROL,'a'、Keys.CONTROL,'c'等等
下拉框
select=Select(driver.find_element_by_id("selectA"))
select.select_by_index()、select_by_value()、select_by_visible_text()
警告框
alert=driver.switch_to.alert
alert.text、accept()、dismiss()
滚动条控制
js="window.scrollTo(0,1000)"或js = "document.documentElement.scrollTop = 1000"
driver.execute_script(js)
表单切换
switch_to.frame("myframe1")
switch_to.default_content()
窗口切换
current_window_handle
window_handles
switch_to.window(handle)
窗口截图
get_screenshot_as_file(imgpath)
save_screenshot(imgpath)
验证码处理方式
去掉验证码(测试环境下-采用)
设置万能验证码(生产环境-采用)
验证码识别工具(通过Python-tesseract)
手工处理:验证码在接口返回,在logs文件里获取。获取cookie
记录cookie(通过记录cookie进行登录-推荐)
get_cookie(key)
get_cookies()
add_cookie(dict)
4.UnitTest
TestCase:一条用例就是一个完整的测试流程。
用法
import unittest
继承unittest.TestCase
命名必须以test开头
TestSuite
TestSuite测试套件:多条测试用例集合统一执行。
方式1:suite=unittest.TestSuite()
suite.addTest("ClassName(MethodName)")或
suite.addTest(unittest.makeSuite(ClassName))
方式2:suite=unittest.defaultTestLoader.discover("./cases",pattern="testcase_*.py")
TestSuite需要配合TextTestRunner才能被执行
TextTestRunner
TextTestRunner测试运行器:执行测试。
runner=unittest.TextTestRunner()runner.run(suite)
Fixture
Fixture固件:用于处理执行测试用例的一些准备工作。比如测试用例环境的搭建和销毁、数据库连接、初始数据、数据清理工作、开启临时服务。
必须继承unittest.TestCase类,setUp、tearDown才是一个Fixture;
setUp:一般做初始化工作,比如:实例化浏览器、浏览器最大化、隐式等待设置
tearDown:一般做结束工作,比如:退出登录、关闭浏览器
如果一个测试类有多个test开头方法,则每个方法执行之前都会运行setUp、结束时运行tearDown
5.测试报告
Export Test Results (UnitTest 自带)
使用控制台左边右上角的按钮。
HTMLTestRunner(第三方模板)
suite = unittest.defaultTestLoader.discover("./cases", pattern="testcase_*.py")
with open("./reports/测试报告1.html", "wb") as f:
runner = HTMLTestRunner(stream=f, title="测试报告", description="测试用例")runner.run(suite)