* 切换至指定frame: driver.switch_to_frame(***)
情况1. 需要切换至的frame有id或name标记,则可以直接使用切换语句,如
driver.switch_to_frame('ifbg') #括号内填入iframe的id或name标记值均可
情况2. frame没有id或name标记,但有class标记,需要先获取到对应的frame,然后在切换至该frame
frame1 = driver.find_element_by_css_selector(".main-iframe")
driver.switch_to_frame(frame1)
* python实现selenium断言和验证
python实现selenium断言和验证
如验证百度搜索的标题是否为“123_百度搜索”
self.assertEqual(u"123_百度搜索",driver.title)
如要验证是否为false
self.assertFalse(driver.title)
如要验证是否为true
self.assertTrue(driver.title)
而验证为了保证失败也能正常运行下去,一般情况下都是在验证的基础上加异常捕获,如验证百度搜索的标题是否为“123_百度搜索”
try:
self.assertEqual(u"1234_百度搜索", driver.title)
except AssertionError as e:
print u"找不到这个标题"
self.assertIn(a,b) 判断a in b是否成立,正确则True,否则为False
self.assertNotIn(a,b) 判断a in b是否成立,不成立则True 否则 False
* python assert使用说明
self.assertEqual(a,b,msg=msg) #判断a与1.b是否一致,msg类似备注,可以为空
self.assertNotEqual(a,b,msg=msg) #判断a与b是否不一致
self.assertTrue(a,msg=none) #判断a是否为True
self.assertFalse(b,msg=none) #判断b是否为false
self.assertAlmostEqual(a,b,places=none,msg=none,delta=none) #该判断过程有点复杂,判断过程如下
注:places与delta不能同时存在,否则出异常
#若a==b,则直接输入正确,不判断下面的过程
#若delta有数,places为空,判断a与b的差的绝对值是否<=delta,满足则正确,否则错误
#若delta为空,places有数,判断b与a的差的绝对值,取小数places位,等于0则正确,否则错误
#若delta为空,places为空,默认赋值places=7判断
例 assertAlmostEqual(2,2) 正确,
assertAlmostEqual(5,2,delta=4) 正确
assertAlmostEqual(5,2,delta=2) 错误
assertAlmostEqual(2,2.005,places=1) 正确
assertAlmostEqual(2,2.05,places=3) 错误
self.assertNotAlmostEqual(a,b,places=none,msg=none,delta=none) 同上,但判断相反
注,delta与places不能同时存在,否则抛出异常
例 assertNotAlmostEqual(2,2) 错误
assertNotAlmostEqual(a,b,delta=c) #a不等于b 同时 a-b>c 则正确,否则错误
assertNotAlmostEqual(a,b,places=2)
#a不等于b 同时|b-a|*0,01 不等于0 则正确,否则错误
self.assertSequenceEqual #有空在研究,源码很长
self.assertListEqual #有空研究
self.assertTupleEqual #有空在研究
self.assertSetEqual #有空在研究
self.assertIn(a,b) 判断a in b是否成立,正确则True,否则为False
例: assertIn(“2” in “23”) 成功
assertIn(“1” in “23”) 失败
self.assertNotIn(a,b) 判断a in b是否成立,不成立则True 否则 False
例:assertIn(“2” in “23”) 失败
assertIn(“1” in “23”) 成功
self.assertIs(a,b) 判断a 与b的对象是否相同,成立则True,否则False
注,判断是否同一对象 id(a) 若id相同,则为同一对象
例 a,b=1,1.0
assertls(a,b) 失败
a,b=1,1
assertls(a,b) 成功
self.assertIsNot(a,b) 判断a 与b的对象是否相同,不成立True,否则False
self.assertDictEqual(a,b) #判断字典a和字典b是否相等,a,b为字典
self.assertDictContainsSubset
self.assertItemsEqual(a,b) #比较两字符串是否一致,同sorted(a)==sorted(b)
注:sorted排序,方法内部为,将a,b分别list,生成各自列表,在sorted排序在比对
self.assertMultiLineEqual(a,b) #比较a文本与b文本是否一致,即便多了个换行,也会区分
self.assertLess(a,b) #判断a<b 成立则通过,否则失败
self.assertLessEqual #判断a<=b 成立则通过,否则失败
self.assertGreater #判断a>b 成立则通过,否则失败
self.assertGreaterEqual #判断a>=b 成立则通过,否则失败
self.assertIsNone(obj=””) #判断obj=None 成立则通过,否则失败
self.assertIsNotNone #判断obj=None 成立则失败,否则通过
self.assertIsInstance(a,b) #判断a的数据类型是否为b,isinstance(a,b) 成立则通过,否则失败
self.assertNotIsInstance #判断同上相反
self.assertRaisesRegexp #正则判断匹配,没仔细看,过程复杂
self.assertRegexpMatches(a,b) #正则匹配 同re.search(b,a)匹配有则成功,否则失败
注:a为匹配的正则表达式,必须字符型,b 为要匹配的内容
self.assertNotRegexpMatches #同上,判断相反
具体格式参见 help(’unittest‘) 的说明
* 下拉导航菜单点击报错处理exceptions.ElementNotInteractableException: Message: Element is not visible
方法一:
ActionChains(driver).click(aa).click(bb).perform()
方法二:
ActionChains(driver).move_to_element(aa).perform()
bb.click()
注:aa和bb为定位元素的动作,方法二只适合谷歌,IE依然会报错
* ActionChains方法列表
click(on_element=None) ——单击鼠标左键
click_and_hold(on_element=None) ——点击鼠标左键,不松开
context_click(on_element=None) ——点击鼠标右键
double_click(on_element=None) ——双击鼠标左键
drag_and_drop(source, target) ——拖拽到某个元素然后松开
drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开
key_down(value, element=None) ——按下某个键盘上的键
key_up(value, element=None) ——松开某个键
move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
move_to_element(to_element) ——鼠标移动到某个元素
move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置
perform() ——执行链中的所有动作
release(on_element=None) ——在某个元素位置松开鼠标左键
send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素
* 浏览器导航页的返回、前进、刷新
driver.back()
driver.forward()
driver.refresh()
* 下拉菜单选中
mm = Select(driver.find_element_by_id('aaType'))
mm.select_by_index(2)
* 设置报告文件保存路径
report_path = os.path.dirname(os.path.abspath('.')) + '/test_report/'
* 获取系统当前时间
now = time.strftime("%Y-%m-%d %H.%M.%S", time.localtime(time.time()))
* 不同窗口之间的切换(handle)
获取当前页面句柄
driver.current_window_handle
获取所有页面窗口的句柄
aa = driver.window_handles
切换窗口
driver.switch_to_window(aa[1]) 或 driver.switch_to_window(aa[-1])
关闭窗口
driver.close()
回到主窗口
driver.switch_to_window(aa[0])
* addTest()逐个加载指定用例到测试套件中去
suite = unittest.TestSuite ()
suite.addTest (TestBdd ('test_ccc'))
suite.addTest (TestAdd ('test_aaa'))
runner= unittest.TextTestRunner ()
runner.run (suite)
注:TestBdd为类名,test_ccc为用例名
* 用makeSuite()方法,一次性加载一个类文件下所有测试用例到suite中去
suite = unittest.TestSuite(unittest.makeSuite(BaiduSearch))
runner=unittest.TextTestRunner()
runner.run(suite)
* 用discover()方法去加载一个路径下所有的测试用例
suite = unittest.TestLoader().discover("testsuites")
runner=unittest.TextTestRunner()
runner.run(suite)
* 自动化测试报告的生成
# 设置报告文件保存路径
report_path = os.path.dirname(os.path.abspath('.')) + '/test_report/'
# 获取系统当前时间
now = time.strftime("%Y-%m-%d %H.%M.%S", time.localtime(time.time()))
# 设置报告名称格式
HtmlFile = report_path + now + "-HTMLtemplate.html"
fp=open(HtmlFile,'wb')
# 构建suite
suite = unittest.TestLoader().discover("testsuites")
if __name__ == '__main__':
# 初始化一个HTMLTestRunner实例对象,用来生成报告
runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u"某某项目测试报告", description=u"用例测试情况:" ,verbosity=2, tester='fyr',retry=1)
注: verbosity=2 表示每执行一个用例,就打印一下用例标题,方便查看执行进度
tester='fyr' 用例执行者
retry=1 用例失败后会重新跑一次
# runner = HTMLTestReport.HTMLTestRunner(stream=fp, title=u"自动化测试报告", description='自动化测试演示报告', tester='fyr')
# 开始执行测试套件
runner.run(suite)
* 常见命令
adb start-server
netstat -ano | findstr "5037"
adb install c:\aa.apk