def file_upload(self, locator, file_path): ''' 文件上传 ''' try: mfile = self.find(locator) # 点击 mfile.click() # #方法2 python3.8有异常 time.sleep(2) import pyautogui pyautogui.write(file_path) time.sleep(2) pyautogui.press('enter', 2) time.sleep(3) ##方法1 # from pywinauto import Desktop # from pywinauto import Desktop # app = Desktop() # # 窗口 # dialog = app['打开'] # 根据名字找到弹出窗口 # # 窗口上的控件 # time.sleep(1) # dialog["Edit"].type_keys(file_path) # 在输入框中输入值 # time.sleep(2) # dialog["Button"].click() # time.sleep(2) # 1/文件上传失败时,强制等待时间可以增多去调试验证; 2/打断点时需要断点到上传后打,否则有可能失败 except Exception as err: self.save_screenshot() do_log.error(f"上传文件失败:{err}") else: return self
def upload(self, filePath, img_desc, browser_type="chrome", wait_time=5): do_log.info("'{}' 开始上传文件 '{}'".format(img_desc, filePath)) try: if browser_type == "chrome": title = "打开" else: title = "" # 找元素 # 一级窗口"#32770","打开" dialog = win32gui.FindWindow("#32770", title) # ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, "ComboBoxEx32", None) # 二级 comboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, "ComboBox", None) # 三级 # 编辑按钮 edit = win32gui.FindWindowEx(comboBox, 0, 'Edit', None) # 四级 # 打开按钮 # button = win32gui.FindWindowEx(dialog, 0, 'Button', "打开(O)") # 二级 button = win32gui.FindWindowEx(dialog, 0, 'Button', None) # 往编辑当中,输入文件路径 。 win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, filePath) # 发送文件路径 time.sleep(wait_time) win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button) # 点击打开按钮 do_log.info("{}上传 '{}' 成功".format(img_desc, filePath)) time.sleep(wait_time) except: do_log.error("{}上传 '{}' 失败".format(img_desc, filePath)) raise
def click_element(self, locator): """点击某个元素""" try: e = self.wait_element_clickable(locator) e.click() return self except Exception as err: self.save_screenshot() do_log.error(f"元素定位失败:{err}")
def click_element(self, loc, img_desc, timeout=30, frequency=0.5): do_log.info("在 '{}' 点击 ' {}' 元素".format(img_desc, loc)) try: self.find_element(loc, img_desc, timeout, frequency).click() do_log.info("在 '{}' 点击元素成功".format(img_desc)) except: do_log.error("在 '{}' 点击元素失败".format(img_desc)) self.save_error_screenshot(img_desc) raise
def wait_element_present(self, locator, timeout=20, poll_frequency=0.2): """等待元素被加载""" wait = WebDriverWait(self.driver, timeout, poll_frequency) try: e = wait.until(expected_conditions.presence_of_element_located(locator)) return e except Exception as err: self.save_screenshot() do_log.error(f"元素定位失败:{err}")
def move_to_ele_with_click(self, loc, img_desc, timeout=30, frequency=5): do_log.info("鼠标悬浮并点击 '{}' ,元素值为 '{}'".format(img_desc, loc)) ele = self.find_element(loc, img_desc, timeout, frequency) try: ActionChains(self.driver).move_to_element(ele).click(ele).perform() do_log.info("悬浮到 '{}' 元素成功".format(img_desc)) except: do_log.error("悬浮到 '{}' 元素失败".format(img_desc)) self.save_error_screenshot(img_desc) raise
def find(self, locator): """查找元素""" try: e = self.driver.find_element(*locator) except Exception as err: # 没有找到元素 do_log.error(f"元素定位失败:{err}") self.save_screenshot() else: return e
def right_click_ele(self, loc, img_desc, timeout=30, frequency=5): do_log.info("右击 '{}' ,元素值为 '{}' ".format(img_desc, loc)) ele = self.find_element(loc, img_desc, timeout, frequency) try: ActionChains(self.driver).context_click(ele).perform() do_log.info("右击 '{}' 元素成功".format(img_desc)) except: do_log.error("右击 '{}' 元素失败".format(img_desc)) self.save_error_screenshot(img_desc) raise
def find_element(self, loc, img_desc, timeout=30, frequency=0.5): do_log.info("查找 '{}' 元素值为 '{}' ".format(img_desc, loc)) self.wait_ele_visible(loc, img_desc, timeout, frequency) try: ele = self.driver.find_element(*loc) do_log.info("找到 '{}' 元素".format(img_desc)) return ele except: do_log.error("未找到 '{}' 元素".format(img_desc)) raise
def wait_element_clickable(self, locator, timeout=20, poll_frequency=0.2): """等待元素可以被点击""" wait = WebDriverWait(self.driver, timeout, poll_frequency) try: e = wait.until(expected_conditions.element_to_be_clickable(locator)) except Exception as err: self.save_screenshot() do_log.error(f"元素定位失败:{err}") else: return e
def click_element_use_js(self, loc, img_desc, timeout=30, frequency=0.5): do_log.info("在 '{}' 点击 ' {}' 元素".format(img_desc, loc)) ele = self.find_element(loc, img_desc, timeout, frequency) try: self.driver.execute_script("arguments[0].click()", ele) do_log.info("在 '{}' 点击元素成功".format(img_desc)) except: do_log.error("在 '{}' 点击元素失败".format(img_desc)) self.save_error_screenshot(img_desc) raise
def switch_frame_by_name(self, name, img_desc, wait_time=0): do_log.info("在 '{}' 切换到名称为 '{}' 的frame".format(img_desc, name)) time.sleep(wait_time) try: self.driver.switch_to.frame(name) do_log.info("切换到名称为 '{}' frame成功".format(img_desc)) except: do_log.error("切换到名称为 '{}' frame失败".format(img_desc)) self.save_error_screenshot(img_desc) raise
def switch_frame_by_index(self, index, img_desc, wait_time=0): do_log.info("在 '{}' 切换到索引为 '{}' 的frame".format(img_desc, index)) time.sleep(wait_time) try: self.driver.switch_to.frame(index) do_log.info("切换索引为 '{}' frame成功".format(img_desc)) except: do_log.error("切换 '{}'索引为 frame失败".format(img_desc)) self.save_error_screenshot(img_desc) raise
def input_text_in_active_ele(self, img_desc, text_value, wait_time=0): do_log.info("在 '{}' 活动元素处输入 '{}' ".format(img_desc, text_value)) time.sleep(wait_time) try: self.get_active_ele(img_desc).send_keys(text_value) do_log.info("在 '{}' 输入文本值成功".format(img_desc)) except: do_log.error("在 '{}' 输入文本值失败".format(img_desc)) self.save_error_screenshot(img_desc) raise
def slide_scoll_bar_to_bottom(self, img_desc, wait_time=0): do_log.info("开始滑动 '{}' 到底部".format(img_desc)) time.sleep(wait_time) try: self.driver.execute_script( "window.scrollTo(0, document.body.scrollHeight)") do_log.info("滑动 '{}' 到底部成功".format(img_desc)) except: do_log.error("滑动 '{}' 到底部部失败".format(img_desc)) self.save_error_screenshot(img_desc) raise
def get_ele_text(self, loc, img_desc, timeout=30, frequency=0.5): do_log.info("获取 '{}' 元素的 '{}' 文本值".format(img_desc, loc)) ele = self.find_element(loc, img_desc, timeout, frequency) try: text = ele.text do_log.info("获取 '{}' 文本为 '{}' 成功".format(img_desc, text)) return text except: do_log.error("获取 '{}' 文本失败".format(img_desc)) self.save_error_screenshot(img_desc) raise
def switch_to_window(self): """ 窗口切换到最新的窗口 """ handles = self.driver.window_handles # 获取浏览器当前打开的窗口数 try: WebDriverWait(self.driver, 30, 1).until(expected_conditions.new_window_is_opened(handles)) # 等待新窗口出现 self.driver.switch_to.window(self.driver.window_handles[-1]) # 切换到新窗口 except Exception as err: self.save_screenshot() do_log.error(f"窗口切换失败:{err}") else: return self
def double_click(self, locator): """双击某个元素""" try: e = self.wait_element_clickable(locator) ac = ActionChains(self.driver) ac.double_click(e).perform() except Exception as err: self.save_screenshot() do_log.error(f"元素定位失败:{err}") else: return self
def slide_scoll_bar_to_top(self, loc, img_desc, timeout=30, frequency=0.5): do_log.info("开始滑动 '{}' 到顶部".format(img_desc)) ele = self.find_element(loc, img_desc, timeout, frequency) try: self.driver.execute_script( "window.scrollTo(document.body.scrollHeight, 0)") do_log.info("滑动 '{}' 到顶部成功".format(img_desc)) except: do_log.error("滑动 '{}' 到顶部失败".format(img_desc)) self.save_error_screenshot(img_desc) raise
def input_text(self, loc, img_desc, text_value, timeout=30, frequency=0.5): do_log.info("在 '{}' 的 '{}' 元素处输入 '{}' ".format(img_desc, loc, text_value)) try: self.find_element(loc, img_desc, timeout, frequency).send_keys(text_value) do_log.info("在 '{}' 输入文本值成功".format(img_desc)) except: do_log.error("在 '{}' 输入文本值失败".format(img_desc)) self.save_error_screenshot(img_desc) raise
def switch_to_alert(self): """切换到弹窗""" try: WebDriverWait(self.driver, 30).until(expected_conditions.alert_is_present()) # 等待弹窗出现 alert = self.driver.switch_to.alert # 先切换到弹框的 alert.accept() # 确认 # text=alert.text() #获取弹窗文本内容 except Exception as err: self.save_screenshot() do_log.error(f"元素定位失败:{err}") else: return alert
def switch_to_frame(self, e, wait=False): """iframe 切换""" try: if not wait: self.driver.switch_to.frame(e) return self wait = WebDriverWait(self.driver, 30) wait.until(expected_conditions.frame_to_be_available_and_switch_to_it(e)) return self except Exception as err: self.save_screenshot() do_log.error(f"元素定位失败:{err}")
def find_and_red(self, locator): """定位元素并且标成红色.。 装饰器实现。""" try: e = self.driver.find_element(*locator) # js 指令改变该元素的背景色。 border js_code = "arguments[0].style.borderColor='red';" self.driver.execute_script(js_code, e) except Exception as err: do_log.error(f"元素定位失败:{err}") else: return e
def test_login(self, login): """登录成功""" try: driver = login home_page = HomePage(driver) res = home_page.find_data() expect = "新 建" assert expect in res except Exception as e: do_log.error(f"测试用例不通过:{e}") raise e
def test_login_error(self, browser, test_info): """登录失败""" try: login_page = LoginPage(browser) login_page.get().login(test_info["user"], test_info["password"]) res = login_page.login_error_text() expect = "帐号或密码不正确" assert expect in res except Exception as e: do_log.error(f"测试用例不通过:{e}") raise e
def test_adddoc(self, login): """新建doc功能""" try: driver = login home_page = HomePage(driver) home_page.get() res = home_page.find_open() expect = "开始" assert expect == res except Exception as e: do_log.error(f"测试用例不通过:{e}") raise e
def get_active_ele(self, img_desc): """ return 一个活动的元素对象,适用于光标所在处的元素 :param img_desc: :return: Webelement对象 """ do_log.info("查找 '{}' 的活动元素".format(img_desc)) try: ele = self.driver.switch_to.active_element do_log.info("找到 '{}' 活动的元素".format(img_desc)) return ele except: do_log.error("未找到 '{}' 活动的元素".format(img_desc)) raise
def wait_ele_visible(self, loc, img_desc, timeout=30, frequency=0.5): do_log.info("等待 '{}' 元素值为 '{}' 可见".format(img_desc, loc)) start_time = time.time() try: WebDriverWait(self.driver, timeout, frequency).until( EC.visibility_of_element_located(loc)) except: do_log.error("查找 '{}' 元素出现失败".format(img_desc)) raise else: end_time = time.time() wait_time = time.strftime("%H:%M:%S", time.localtime(end_time - start_time)) do_log.info("等待 '{}' 元素出现成功,等待时间为 {}s".format(img_desc, wait_time))
def slide_scoll_bar_to_ele_top(self, loc, img_desc, timeout=30, frequency=0.5): do_log.info("开始滑动页面滚动条到 '{}' 顶部对齐,元素值为 '{}'".format(img_desc, loc)) ele = self.find_element(loc, img_desc, timeout, frequency) try: self.driver.execute_script("arguments[0].scrollIntoView();", ele) do_log.info("滑动页面滚动条到 '{}' 顶部对齐成功".format(img_desc)) except: do_log.error("滑动页面滚动条到 '{}' 顶部对齐失败".format(img_desc)) self.save_error_screenshot(img_desc) raise
def switch_frame_by_webelement(self, loc, img_desc, timeout=30, frequency=0.5): do_log.info("在 '{}' 切换到 '{}' frame".format(img_desc, loc)) ele = self.find_element(loc, img_desc, timeout, frequency) try: self.driver.switch_to.frame(ele) do_log.info("切换 '{}' frame成功".format(img_desc)) except: do_log.error("切换 '{}' frame失败".format(img_desc)) self.save_error_screenshot(img_desc) raise