8)下拉框 from selenium import webdriver from selenium.webdriver.support.select import Select driver = webdriver.Chrome() driver.get('file:///D:/lesson2/%E7%AC%AC%E4%BA%8C%E4%B8%AA%E6%9C%88%E7%9A%84%E8%AF%BE%E4%BB%B6/20.11.16%E5%8F%B7-18%E5%8F%B7%20%E7%AC%AC%E4%BA%8C%E4%B8%AA%E6%9C%88%E4%B9%8B%E7%AC%AC11%E8%AE%B2%EF%BC%9A%E5%A4%9A%E6%B5%8B%E5%B8%88ui%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E5%AE%9E%E6%88%98%E4%B9%8Bselenium/elem/select.html') driver.maximize_window() s = driver.find_element_by_name('select') 定位到下拉框 第一种方式 索引值开始 是0开始 Select(s).select_by_index(3) 桔子 第二种方法 Select(s).select_by_value('banana') 香蕉 Select(s).select_by_visible_text('桃子') 桃子 9)警告型弹框 from selenium import webdriver from time import sleep driver = webdriver.Chrome() driver.get('file:///D:/lesson2/%E7%AC%AC%E4%BA%8C%E4%B8%AA%E6%9C%88%E7%9A%84%E8%AF%BE%E4%BB%B6/20.11.16%E5%8F%B7-18%E5%8F%B7%20%E7%AC%AC%E4%BA%8C%E4%B8%AA%E6%9C%88%E4%B9%8B%E7%AC%AC11%E8%AE%B2%EF%BC%9A%E5%A4%9A%E6%B5%8B%E5%B8%88ui%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E5%AE%9E%E6%88%98%E4%B9%8Bselenium/elem/alert.html') driver.maximize_window() alert = driver.switch_to.alert print(alert.text) sleep(3) alert.accept() 点击确定 alert.accept() 在确定 alert.dismiss() 取消按钮 alert.accept() 取消后在确定 11)确认弹框 from selenium import webdriver from time import sleep driver = webdriver.Chrome() driver.get('file:///D:/lesson2/%E7%AC%AC%E4%BA%8C%E4%B8%AA%E6%9C%88%E7%9A%84%E8%AF%BE%E4%BB%B6/20.11.16%E5%8F%B7-18%E5%8F%B7%20%E7%AC%AC%E4%BA%8C%E4%B8%AA%E6%9C%88%E4%B9%8B%E7%AC%AC11%E8%AE%B2%EF%BC%9A%E5%A4%9A%E6%B5%8B%E5%B8%88ui%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E5%AE%9E%E6%88%98%E4%B9%8Bselenium/elem/enter.html') driver.maximize_window() driver.find_element_by_class_name('alert').click() 点击确认弹框 alert = driver.switch_to.alert print(alert.text) alert.accept() 点击确定 alert.dismiss() 点击取消 12)输入型弹框 from selenium import webdriver from time import sleep driver = webdriver.Chrome() driver.get('file:///D:/lesson2/%E7%AC%AC%E4%BA%8C%E4%B8%AA%E6%9C%88%E7%9A%84%E8%AF%BE%E4%BB%B6/20.11.16%E5%8F%B7-18%E5%8F%B7%20%E7%AC%AC%E4%BA%8C%E4%B8%AA%E6%9C%88%E4%B9%8B%E7%AC%AC11%E8%AE%B2%EF%BC%9A%E5%A4%9A%E6%B5%8B%E5%B8%88ui%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E5%AE%9E%E6%88%98%E4%B9%8Bselenium/elem/prompt.html') driver.maximize_window() driver.find_element_by_class_name('alert').click() alert = driver.switch_to.alert sleep(3) alert.send_keys() alert.accept() 点击确定 alert.dismiss() 点击取消 13)iframe框 from selenium import webdriver from time import sleep driver = webdriver.Chrome() driver.get('http://mail.163.com/') driver.maximize_window() 第一种方法定位iframe框 iframe = driver.find_element_by_xpath('//*[@id="loginDiv"]/iframe[1]') 定位到iframe driver.switch_to.frame(iframe) 进入到iframe 第二种方法 ==》页面的iframe索引值,从0开始 driver.switch_to.frame(0) 进入到iframe 第三种方法 iframe = driver.find_element_by_tag_name('iframe') iframen 标签 driver.switch_to.frame(iframe) 进入到iframe sleep(3) driver.find_element_by_name('email').send_keys('13923876846') driver.find_element_by_name('password').send_keys('Duanzl888') driver.find_element_by_id('dologin').click() driver.switch_to.default_content() 退出iframe框 14)滚动条 from selenium import webdriver from time import sleep driver = webdriver.Chrome() driver.get('http://www.jd.com') driver.maximize_window() 往下滑的操作 js1 = 'window.scrollTo(0,20000)' driver.execute_script(js1) sleep(3) 往上滑操作 js2 = 'window.scrollTo(0,0)' driver.execute_script(js2) 14)Keys类 from selenium import webdriver from time import sleep from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() driver.get('') driver.maximize_window() driver.find_element_by_id('kw').send_keys('pythonn') sleep(3) driver.find_element_by_id('kw').send_keys(Keys.BACK_SPACE) 删除最后一个字符 sleep(3) driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'a') 全选 sleep(3) driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'x') 剪切 sleep(3) driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'v') 粘贴 sleep(3) driver.find_element_by_id('kw').send_keys(Keys.ENTER) 点击确定 def find_element(locator,*value): ''' 封装一个定位元素的公共方法 :param locator: :param value: :return: ''' sleep(2) return driver.find_element_by_id(locator).send_keys(value) if __name__ == '__main__': find_element('kw','pythonn') find_element('kw',Keys.BACK_SPACE) find_element('kw', Keys.CONTROL,'a') find_element('kw', Keys.CONTROL, 'x') find_element('kw', Keys.CONTROL, 'v') find_element('su', Keys.ENTER) 15)我们之前写的脚本叫作线性脚本,需要把这些封装在类里面 from selenium import webdriver from time import sleep driver = webdriver.Chrome() driver.get('http://cms.duoceshi.cn/cms/manage/login.do') driver.maximize_window() sleep(3) driver.find_element_by_id('userAccount').send_keys('admin') driver.find_element_by_id('loginPwd').send_keys('123456') driver.find_element_by_id('loginBtn').click() 需要封装在类里面 from selenium import webdriver from time import sleep class Cms(object): def __init__(self): 构造函数 self.driver = webdriver.Chrome() 创建driver对象 self.driver.get('') self.driver.maximize_window() self.driver.implicitly_wait(5) def login(self): ''' 封装一个登录函数 :return: ''' self.driver.find_element_by_id('userAccount').send_keys('admin') self.driver.find_element_by_id('loginPwd').send_keys('123456') self.driver.find_element_by_id('loginBtn').click() sleep(3) def center(self): ''' 封装一个用户中心函数 :return: ''' self.driver.find_element_by_xpath('//*[@id="menu-user"]/dt').click() if __name__ == '__main__': c = Cms() 创建一个对象 c.login() c.center() 16、为了解决用例分离的问题我们引用了unittest单元测试框架 python中有哪些框架:unittest pytest nose junit unittest 单元测试框架的作用,最开始的作用用来做单元测试,测试用例组织和管理 我们的ui自动化用例 import unittest 导入unittest模块 class Test(unittest.TestCase): @classmethod 装饰器 def setUpClass(cls) -> None: 类开始和类的结束只会运行一次 print('类的开始') @classmethod def tearDownClass(cls) -> None: print('类的结束') def setUp(self) -> None: 在每运行一条用例之前运行一次,创建浏览器最大化 print('方法的开始') def tearDown(self) -> None: 在每运行一条用例之后运行一次,释放资源,关闭浏览器 print('方法的结束') def test002(self): print(222) def test001(self): unitest运行用例的顺序规则ASCII 0-9 A-Z a-z print(111) def test_a(self): print(444) def test_A(self): print(333) def dcs(self): unittest 测试框架只会运行test开头的用例 print(555) if __name__ == '__main__': unittest.main() unittest测试框架是运行用例的入口,main是函数,所用就是运行所有的用例 17、需求:百度搜索python和selenium import unittest from selenium import webdriver from time import sleep from dcs9_ui_auto.HTMLTestRunner3_New import HTMLTestRunner class Baidu_Test(unittest.TestCase): def setUp(self) -> None: self.driver = webdriver.Chrome() 创建driver对象 self.driver.get() self.driver.maximize_window() self.driver.implicitly_wait(5) def tearDown(self) -> None: sleep(5) self.driver.close() 退出浏览器 def test01(self): self.driver.find_element_by_id('kw').send_keys('python') def test02(self): self.driver.find_element_by_id('kw').send_keys('selenium') 把用例放进一个套件里面 def all_case(): suit = unittest.TestSuite() 创建一个suit对象,类似一个容器,用来装测试用例 第一种方法 单条用例 suit.addTest(Baidu_Test('test01')) 把test01这个测试用例装进suit里面 第二种方法 suit.addTests([Baidu_Test('test01'),Baidu_Test('test02')]) return suit 把装好的用例suit套件返回给函数调用处,谁调用all_case函数,就拿到了用例 if __name__ == '__main__': 1、第一种运行方式 unittest.main() 运行所有的用例 2、运行用例的第二种(单条用例) runner = unittest.TextTestRunner() 根据TextTestRunner类创建一个runner对象 然后runner对象调用run方法运行用例 runner.run(all_case()) 运行用例的第三种方法(自动化搜索用例) 自动化搜索用例+自动运行+生成报告 defaultTestLoader 是TestLoader类的对象 discover()方法会自动化搜索特定路径中以lesson开头并且py结尾的模块中test开头的用例 start_dir = 'C:\my_project\dcs\dcs9_ui_auto' 当前模块包的路径 filename = start_dir+'\\ui_report.html' 生成报告的路径和名称 f = open(filename,'wb') wb 是以二进制的方式往filename 文件里面写入测试结果后的报告 discover = unittest.defaultTestLoader.discover(start_dir,pattern='lesson*.py') 自动化搜索用例 runner =HTMLTestRunner(stream=f,title='百度自动化测试报告', description='测试结果如下:',tester='小段') runner.run(discover)
|