主线参考来源:https://www.cnblogs.com/yoyoketang/tag/selenium/default.html?page=1
1.定位方法
1.id定位:find_element_by_id(self, id_)
2.name定位:find_element_by_name(self, name)
3.class定位:find_element_by_class_name(self, name)
4.tag定位:find_element_by_tag_name(self, name)
5.link定位:find_element_by_link_text(self, link_text)
6.partial_link定位find_element_by_partial_link_text(self, link_text)
7.xpath定位:find_element_by_xpath(self, xpath)
8.css定位:find_element_by_css_selector(self, css_selector)
(element形式相同)( t2 = driver.find_element(“name”, "tj_trnews"该形式也可)
补充:关于Fiddler:http://www.hangge.com/blog/cache/detail_1697.html
2.unittest
参考:https://blog.csdn.net/huilan_same/article/details/52944782
核心:定义类class Blog(unittest.TestCase)
1.测试用例的名称要以test开头;
2.每一个用例执行的结果的标识,成功是 .,失败是 F,出错是 E,跳过是 S
3.在unittest.main()中加 verbosity 参数可以控制输出的错误报告的详细程度,默认是 1,如果设为 0,则不输出每一用例的执行结果,即没有上面的结果中的第1行;如果设为 2,则输出详细的执行结果;
4.前置和后置(如果没有也可以写pass)
1.setUp:在写测试用例的时候,每次操作其实都是基于打开浏览器输入对应网址这些操作,这个就是执行用例的前置条件。
2.tearDown:执行完用例后,为了不影响下一次用例的执行,一般有个数据还原的过程,这就是执行用例的后置条件。
5.TestSuite(控制用例执行的程序)
6.批量执行
1.新建Pure Python
2.选中刚才新建的工程右键>New>Python Package>新建一个case文件夹
3.重复第2步的操作,新建一个case的文件夹,放入用例脚本
4.打开脚本,写入用例
5.项目下面创建一个脚本run_all_case.py,接下来用这个脚本去批量执行所有的用例。里面可以用以下方法:discover
-
1.discover方法里面有三个参数:
-case_dir:这个是待执行用例的目录。
-pattern:这个是匹配脚本名称的规则,test*.py意思是匹配test开头的所有脚本。
-top_level_dir:这个是顶层目录的名称,一般默认等于None就行了。
2.discover加载到的用例是一个list集合,需要重新写入到一个list对象testcase里,这样就 可以用unittest里面的TextTestRunner这里类的run方法去执行。discover=unittest.defaultTestLoader.discover(case_path,pattern=’‘test*.py’’,top_level_dir=None)
if name == “main”:
runner = unittest.TextTestRunner()
runner.run(all_case())
#html报告
report_abspath = os.path.join(report_path, “result.html”)
fp = open(report_abspath, “wb”)
runner = HTMLTestRunner.HTMLTestRunner(stream=fp,
title=u’自动化测试报告,测试结果如下:’,
description=u’用例执行情况:’)
#调用add_case函数返回值
runner.run(all_case())
fp.close()
7.装饰器
把打开浏览器操作放到前置setUpClass(cls)里,这样就可以实现打开一次浏览器,执行多个case了。tearDownClass(cls)同理。def前加@classmethod
8.断言
- 1.assertEqual(self, first, second, msg=None)
2.assertNotEqual(self, first, second, msg=None)
3.assertIn(self, member, container, msg=None)
4.assertNotIn(self, member, container, msg=None)
5.assertTrue(self, expr, msg=None)
–判断是否为真:expr is True
6.assertFalse(self, expr, msg=None)
7.assertIsNone(self, obj, msg=None)
–判断是否为None:obj is None
8.assertIsNotNone(self, obj, msg=None)
9.数据驱动(ddt)
对多组数据的测试用例,来进行用例自动加载生成
1.测试数据为多个字典的list类型
2.测试类前加修饰@ddt.ddt
3.case前加修饰@ddt.data()
10.htmlhttps://www.cnblogs.com/yoyoketang/p/7744538.html
3.捕获异常
1.为了让程序继续执行,我们可以用try…except…捕获异常。捕获异常后可以打印出异常原因,这样以便于分析异常原因。例:
try:
element = driver.find_element(“id”, “blog_nav_newpostxx”)
except NoSuchElementException as msg:
print u"查找元素异常%s"%msg
常见异常:
- 1.NoSuchElementException:没有找到元素
2.NoSuchFrameException:没有找到iframe
3.NoSuchWindowException:没找到窗口句柄handle
4.NoSuchAttributeException:属性错误
5.NoAlertPresentException:没找到alert弹出
6.lementNotVisibleException:元素不可见
7.ElementNotSelectableException:元素没有被选中
8.TimeoutException:查找元素超时
4.文件下载
SendKeys.SendKeys("{ENTER}")#要先切换到再回车操作
5.截图
get_screenshot_as_file(self, filename)#获取当前窗口的截图
get_screenshot_as_base64(self)#保存成base64编码的格式
6.模拟触摸
from selenium import webdriver
from selenium.webdriver.common.touch_actions import TouchActions
from selenium.webdriver.chrome.options import Options
url = “https://login.m.taobao.com/msg_login.htm?spm=0.0.0.0”
#设置成手机模式
mobile_emulation = {“deviceName”:“iPhone 6”}
options = Options()
options.add_experimental_option(“mobileEmulation”, mobile_emulation)
driver = webdriver.Chrome(chrome_options=options)
driver.get(url)
driver.find_element_by_id(“username”).send_keys(“yoyoketang”)
#触摸事件
el = driver.find_element_by_id(‘getCheckcode’)
TouchActions(driver).tap(el).perform()
7.启动配置
#打开浏览器之前加入
option = webdriver.ChromeOptions()
option.add_argument(‘disable-infobars’)
8.静默模式
#在打开浏览器前加入
option = webdriver.ChromeOptions()
option.add_argument(‘headless’)
9.BeautifulSoup查找类并发送错误
beautifulsoup用法:https://www.cnblogs.com/yoyoketang/tag/beautifulsoup4/
from bs4 import BeautifulSoup
import sys
reload(sys)
sys.setdefaultencoding(‘utf8’)
def is_result_pass():
try:
with open(“result.html”, “r”) as fp:
f = fp.read() # 读报告
soup = BeautifulSoup(f, “html.parser”)
status = soup.find_all(class_=“attribute”)
result = status[2].contents[-1] # 获取报告结果
if “Failure” in result or “Error” in result:
print(“测试过程有不通过用例:%s”%result)
return False
else:
return True
except Exception as msg:
print(“判断过程出现异常:%s”%str(msg))
return False
if name == “main”:
print(“qq交流群:226296743”)
res = is_result_pass()
print(res)
10.BeautifulSoup
例:打印所有时间
r = requests.get(“http://www.cnblogs.com/yoyoketang/”)
#请求首页后获取整个html界面
blog = r.content
#用html.parser解析html
soup = BeautifulSoup(blog, “html.parser”)
获取所有的class属性为dayTitle,返回Tag类
times = soup.find_all(class_=“dayTitle”)
for i in times:
print i.a.string # 获取a标签的文本
1.prettify()这个方法是把文件解析成html格式,用html的标准格式输出(有缩进的)
2.BeautifulSoup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
Tag : 标签对象,如:
yoyoketang
,这就是一个标签NavigableString :字符对象,如:这里是我的微信公众号:yoyoketang
BeautifulSoup :就是整个html对象
Comment :注释对象,如:!-- for HTML5 --,它其实就是一个特殊NavigableString
3.Tag
- 1.tag的name属性,每一个tag都有name属性,用.name获取,如上面的三个name属性分别为p,b,head。也就是<xx开头的,这里的xx就是它的name属性(html是一个树状结构的,每个tag都有属性,整个html对象也有name属性,它的属性是:[document])
2.tag对象contents可以获取所有的子节点,返回的是list;获取所有的子孙节点就可以用.descendants方法
11.多线程
多线程设计思路:
先写一个run的函数
保证for循环能跑的通
在run函数上加个装饰器 @threads(n),n是线程数
12. paramunittest
@paramunittest.parametrized