def init_login(init_driver): try: LoginPage(init_driver).login(*LoginData.success_data) except Exception as e: logger.info("登录前程贷失败") raise e yield init_driver
def test_join_bee(self, init_login): # 1.前程贷首页——点击 第一个标的,进入项目详情页面(投资页面) HomePage(init_login).click_first_mark_ele() # 发红包前在投资页面获取用户可用余额 investpage = InvestPage(init_login) before_user_amount = investpage.get_user_amount_from_InvestPage() # 2.投标页面——点击 蜂群/公社,进入蜂群页面 investpage.click_bee() # 3.蜂群页面——鼠标移动到第一个蜂群点击【查看蜂群】 bp = BeePage(init_login) bp.move_to_first_bee() bp.view_bee() # 4.蜂群详情页(为新窗口) bp.switch_new_win() bh = BeehomePage(init_login) # 发红包后在投资页面获取蜂群的公产规模 before_pub_amount = bh.get_public_money() # 点击敲门红包,并选中“5元”,进行点击 bh.click_red_envelope() bh.click_five_dollor() bh.click_determine() time.sleep(0.5) # 获取发送红包后的提示 reward_success_msg = bh.get_reward_success_msg() # 5.蜂群详情页——进行刷新 bh.refresh_page() # 发红包后在投资页面获取蜂群的公产规模 after_pub_amount = bh.get_public_money() # 6.蜂群详情页——点击【申请加入】按钮 bh.click_join_button() # 点击确定按钮 bh.click_join_determine() time.sleep(0.5) # 获取加入蜂群的提示' join_msg = bh.get_join_msg() # 7.蜂群详情页——点击首页中的第一个标的,进入投资页面 bh.click_home() HomePage(init_login).click_first_mark_ele() # 发红包后在投资页面获取用户可用余额 after_user_amount = investpage.get_user_amount_from_InvestPage() # 断言 try: # 1.申请的蜂群提示 assert join_msg == bee_data.expected_join_msg # 2.发红包后提示 assert reward_success_msg == bee_data.expected_reward_success_msg # 3.蜂群的公产规模+5 expected_pub_amount = Decimal(after_pub_amount) - Decimal( before_pub_amount) assert int(expected_pub_amount) == bee_data.amount # 用户可用金额减少5元 expected_user_amount = Decimal(before_user_amount) - Decimal( after_user_amount) assert int(expected_user_amount) == bee_data.amount except Exception as e: logger.exception("执行测试用例失败,msg:{}".format(e)) raise e else: logger.info("执行测试用例成功")
def get_ele_attr(self, loc, Attribute_name, page_name, timeout=20, poll_time=0.5): """ description : 获取元素的属性值 loc: 元素定位表达式 Attribute_name:属性名 page_name : 页面名称 timeout:超时时间 poll_time:轮询时间 """ self.wait_ele_visible(loc, page_name, timeout=20, poll_time=0.5) logger.info("在{} 获取{}元素的属性".format(page_name, loc)) try: value = self.driver.find_element( *loc).get_attribute(Attribute_name) except Exception as e: self.save_page_Screenshot(page_name) logger.exception("获取{}元素的属性失败".format(loc)) raise e else: logger.info("该元素的属性值为:{}".format(value)) return value
def switch_to_alert(self, page_name, dismiss=False, keys=None): """ description :切换到警告框并进行操作 dismiss : 取消按钮,默认为False, keys : 输入的文本值 """ logger.info("在{} 切换到alert框".format(page_name)) try: alert = self.driver.switch_to.alert() except Exception as e: self.save_page_Screenshot(page_name) logger.exception("切换到alert框失败") raise e else: if keys: alert.send_keys(keys) if dismiss: alert.dismiss() else: alert.accept() else: if dismiss: alert.dismiss() else: alert.accept()
def init_driver(): logger.info("*********测试用例开始执行***********") driver = webdriver.Chrome() driver.get('http://120.78.128.25:8765/Index/login.html') driver.maximize_window() yield driver driver.close() logger.info("*********测试用例执行结束***********")
def save_page_Screenshot(self, page_name): """ description : 对页面进行截图 page_name: 页面的名字 """ now = time.strftime("%y-%m-%d %H_%M_%S") name = "{}_{}.png".format(page_name, now) shot_path = os.path.join(Configuration.screenshot, name) self.driver.save_screenshot(shot_path) logger.info("当前截图存储在:{}".format(shot_path))
def test_login_success(self): logger.info("************登录成功用例****************") lp = LoginPage(self.driver) lp.login(*LoginData.success_data) # 进行断言 try: self.assertTrue(HomePage(self.driver).get_quit_ele_exists()) logger.info("断言成功") except AssertionError as e: logger.exception("断言失败") raise e
def test_login_failed_layui(self, data_info): logger.info("*************登录失败场景2用例***************") lp = LoginPage(self.driver) lp.login(data_info["phone"], data_info["pwd"]) msg_text = lp.get_msg_from_login_layui() # 进行断言 try: self.assertEquals(msg_text, data_info["check"]) logger.info("断言成功") except AssertionError as e: logger.exception("断言失败") raise e
def test_login_failed_form(self, data_info): logger.info("*************登录失败场景1用例*************") # 进行登录操作 lp = LoginPage(self.driver) # 输入空的账号/密码/错误的手机号 lp.login(data_info["phone"], data_info["pwd"]) # 进行断言 try: self.assertEqual(lp.get_msg_from_login_form(), data_info["check"]) logger.info("断言成功") except AssertionError as e: logger.exception("断言失败") raise e
def switch_to_window(self, subscript, page_name): """ description : 切换到新的窗口 Subscript : 窗口下标 page_name : 页面名称 """ wins = self.driver.window_handles logger.info("在{} 进行切换窗口".format(page_name)) try: self.driver.switch_to.window(wins[subscript]) except Exception as e: self.save_page_Screenshot(page_name) logger.exception("切换窗口失败") raise e else: logger.info("切换窗口成功")
def get_elements(self, loc, page_name): """ description : 根据一个定位表达式查找多个元素,返回值为列表,不设置显性等待 loc:元素定位表达式 page_name:页面名称 """ logger.info("在{} 获取{}的多个元素") try: eles = self.driver.find_elements(*loc) except Exception as e: self.save_page_Screenshot(page_name) logger.exception("查找{}元素们失败".format(loc)) raise e else: logger.info("{}元素们找到,返回值为:{}".format(loc, eles)) return eles
def get_element(self, loc, page_name): """ description : 查找元素,不需要设置等待 loc: 元素定位表达式 page_name : 页面名称 """ logger.info("在{} 查找{}元素".format(page_name, loc)) try: ele = self.driver.find_element(*loc) except Exception as e: self.save_page_Screenshot(page_name) logger.exception("查找{}元素失败".format(loc)) raise e else: logger.info("{}元素找到,返回值为:{}".format(loc, ele)) return ele
def test_invest_success(self): # 1.前程贷首页 -- home = HomePage(self.driver) # 投资前,在个人页面/投资页面,获取用户投资前的金额 # 进入个人页面 home.click_personal_center() # 获取投资前的用户金额 Pc = PersonalcenterPage(self.driver) before_user_amount = Pc.get_user_amount_from_PersonalCenter() # 回到上一次浏览的页面 Pc.back_to_previous_page() # 点击首页的第一个标的,进入投资页面 home.click_first_mark_ele() # 初始化投资页面操作 investpage = InvestPage(self.driver) # 在投资页面获取用户余额 # before_user_amount = investpage.get_user_amount_from_InvestPage() # 投资前,在投资页面获取标的投资前的剩余投资金额 before_subject_amount = investpage.get_subject_amount_from_InvestPage() # 2.投资界面 --- 输入2000元金额,进行投标处理 investpage.Input_amount(amount) # 点击投资按钮 investpage.click_tender_button() # 3.投资页面 -- 点击弹框中的“查看并激活按钮”进入个人中心页面 investpage.click_view_and_activate() # 投资完成后,在个人页面获取用户投资后的金额 after_user_amount = Pc.get_user_amount_from_PersonalCenter() # 用户投资后,从个人中心返回到投资页面,刷新, Pc.back_to_previous_page() # 获取标的投资后剩余投资金额 after_subject_amount = investpage.get_subject_amount_from_InvestPage() # 断言 try: # 1.用户投资前的金额 - 投资后的金额=2000 user_expect = Decimal(before_user_amount) - Decimal( after_user_amount) self.assertEqual(int(user_expect), 2000) # 2.(标的投资前的金额 - 投资后的金额)*10000 = 2000 subject_expect = (Decimal(before_subject_amount) - Decimal(after_subject_amount)) * 10000 self.assertEqual(int(subject_expect), 2000) logger.info("pass") except AssertionError as e: logger.exception("断言失败") raise e
def wait_ele_visible(self, loc, page_name, timeout=20, poll_time=0.5): """ description : 等待元素可见 loc: 元素定位表达式 page_name : 页面名称 timeout:超时时间 poll_time:轮询时间 """ logger.info("在{} 等待元素{}可见".format(page_name, loc)) try: WebDriverWait(self.driver, timeout, poll_time).until( EC.visibility_of_element_located(loc)) except Exception as e: self.save_page_Screenshot(page_name) logger.exception("等待{}元素可见失败".format(loc)) raise e else: logger.info("{}元素可见".format(loc))
def switch_to_iframe(self, loc, page_name, time_out=20, poll_time=0.5): """ description : 切换到内联框架iframe中 loc:元素定位表达式,也可以是下标,name,ele对象 page_name:页面名称 time_out: 超时时间 polling_time:轮询时间 """ logger.info("在{} 切换到{}iframe框架中".format(page_name, loc)) try: WebDriverWait(self.driver, time_out, poll_time).until( EC.frame_to_be_available_and_switch_to_it(loc)) except Exception as e: self.save_page_Screenshot(page_name) logger.exception("切换到{}iframe框架失败".format(loc)) raise e else: logger.info("切换到{}iframe框架成功".format(loc))
def get_ele_text(self, loc, page_name, timeout=20, poll_time=0.5): """ description : 获取元素的文本值 loc:元素定位表达式 page_name : 页面名称 timeout:超时时间 poll_time:轮询时间 """ self.wait_ele_visible(loc, page_name, timeout, poll_time) logger.info("在{} 获取{}元素的文本值".format(page_name, loc)) try: text = self.driver.find_element(*loc).text except Exception as e: self.save_page_Screenshot(page_name) logger.exception("获取元素{}的文本失败".format(loc)) raise e else: logger.info("该元素的文本值为:{}".format(text)) return text
def input_keys(self, loc, keys, page_name, timeout=20, poll_time=0.5): """ description : 输入框中输入文本 loc: 元素定位表达式 keys: 文本值 page_name : 页面名称 timeout:超时时间 poll_time:轮询时间 """ self.wait_ele_visible(loc, page_name, timeout=20, poll_time=0.5) logger.info("在{} 的文本框{}进行输入".format(page_name, loc)) try: self.driver.find_element(*loc).send_keys(keys) except Exception as e: self.save_page_Screenshot(page_name) logger.exception("在输入框{}输入文本失败".format(e)) raise e else: logger.info("输入的内容为:{}".format(keys))
def click_ele(self, loc, page_name, timeout=20, poll_time=0.5): """ description : 对元素进行点击操作 loc : 元素定位表达式 page_name:页面名称 timeout:超时时间 poll_time:轮询时间 """ # 等待该元素可见 self.wait_ele_visible(loc, page_name, timeout, poll_time) logger.info("在{} 点击{}元素".format(page_name, loc)) try: self.driver.find_element(*loc).click() except Exception as e: self.save_page_Screenshot(page_name) logger.exception("点击元素{}失败".format(loc)) raise e else: logger.info("点击{}元素成功".format(loc))
def move_to_ele(self, loc, page_name, timeout=20, poll_time=0.5): """ description : 获取多个元素的文本值,为列表 loc:元素定位表达式 page_name : 页面名称 timeout:超时时间 poll_time:轮询时间 """ # 设置等待时间 self.wait_ele_visible(loc, page_name, timeout, poll_time) ele = self.get_element(loc, page_name) logger.info("在{} 将鼠标移动到{}元素上".format(page_name, loc)) try: ActionChains(self.driver).move_to_element(ele).perform() except Exception as e: self.save_page_Screenshot(page_name) logger.expection("鼠标移动到元素上操作失败") raise e else: logger.info("鼠标移动到元素上操作成功")
def get_ele_texts(self, loc, page_name, timeout=20, poll_time=0.5): """ description : 获取多个元素的文本值,为列表 loc:元素定位表达式 page_name : 页面名称 timeout:超时时间 poll_time:轮询时间 """ # 设置等待时间 self.wait_ele_visible(loc, page_name, timeout=20, poll_time=0.5) logger.info("在{} 获取{}元素们的文本".format(page_name, loc)) try: eles_list = self.driver.find_elements(*loc) except Exception as e: self.save_page_Screenshot(page_name) logger.exception("获取多个元素{}失败".format(loc)) raise e else: texts_list = [] if len(eles_list) == 1: logger.info("获取的文本为:{}".format(eles_list[0].text)) return eles_list[0].text else: for ele in eles_list: texts_list.append(ele.text) logger.info("获取的文本为:{}".format(texts_list)) return texts_list
def wait_ele_clickale(self, loc, page_name, timeout=20, poll_time=0.5): """ description : 等待元素可见并且可以被点击,然后进行点击 loc:元素定位表达式 page_name:页面名称 time_out: 超时时间 polling_time:轮询时间 """ logger.info("在{} 等待{}元素可见并且可以被点击".format(page_name, loc)) try: WebDriverWait(self.driver, timeout, poll_time).until(EC.element_to_be_clickable(loc)) except Exception as e: self.save_page_Screenshot(page_name) logger.exception("等待元素{}可见可点击失败".format(loc)) else: logger.info("对{}进行点击".format(loc)) self.driver.find_element(*loc).click() logger.info("点击操作成功")
def setUp(self): logger.info("********登录测试用例前置条件***************") # 初始化操作,保证每次测试都是相互独立的! self.driver = webdriver.Chrome() self.driver.get(CommonData.login_url) self.driver.maximize_window()