def _save_page_shot(self, img_doc): # 截图存放的路径 file_name = os.path.join(PAGESHOTS_DIR, f"{img_doc}_{datetime.strftime(datetime.now(), '%Y%m%d%H%M%S')}.png") do_log.info(f"截图保存在:{file_name}") try: self.driver.save_screenshot(file_name) except: do_log.exception("保存截图失败。") else: do_log.info("保存截图成功。")
def sava_page_screenshot(self, img_doc): now = time.strftime("%Y%m%d%H%M%S") screenshot_path = screenshot_dir + "{}_{}.png".format(img_doc, now) try: self.driver.save_screenshot(screenshot_path) except: do_log.exception("当前页面截图失败") else: do_log.info("页面截图成功并保存在{}".format(screenshot_path))
def get_element(self, img_doc, locator): do_log.info("{},查找元素{}".format(img_doc, locator)) try: ele = self.driver.find_element(*locator) except: do_log.exception("查找元素失败!!!") # 截图 - 命名。 页面名称_行为名称_当前的时间.png self.sava_page_screenshot(img_doc) raise else: return ele
def get_window_handles(self): # 记录日志 do_log.info("获取当前打开的所有的窗口。") try: wins = self.driver.window_handles # 失败了记录日志 except: do_log.exception("获取打开的窗口列表失败。") raise else: do_log.info(f"窗口列表为:{wins}") return wins
def input_text(self, locator, value, img_doc, timeout=30, poll_fre=0.5): #等待元素可见 self.wait_ele_visiable(locator, img_doc, timeout, poll_fre) # 查找元素 ele = self.get_element(img_doc, locator) do_log.info("{},在{}中输入信息{}".format(img_doc, locator, value)) try: ele.send_keys(value) except: do_log.exception("文本信息输入失败") # 截图 - 命名。 页面名称_行为名称_当前的时间.png self.sava_page_screenshot(img_doc) raise
def click_element(self, locator, img_doc, timeout=30, poll_fre=0.5): #等待元素可见 self.wait_ele_visiable(locator, img_doc, timeout, poll_fre) #查找元素 ele = self.get_element(img_doc, locator) do_log.info("{},点击元素{}".format(img_doc, locator)) try: ele.click() except: do_log.exception("元素点击失败") # 截图 - 命名。 页面名称_行为名称_当前的时间.png self.sava_page_screenshot(img_doc) raise
def wait_page_contains_element(self, loc, img_doc, timeout=20, poll_frequency=0.5): do_log.info(f"{img_doc}等待{loc}元素可见。") try: start_time = datetime.now() WebDriverWait(self.driver, timeout, poll_frequency).until(EC.presence_of_element_located(loc)) except: # 输出异常信息 do_log.exception("等待元素存在失败") # 截图,截图名称要见名知意 self._save_page_shot(img_doc) raise else: end_time = datetime.now() do_log.info(f"起始时间:{start_time},结束时间:{end_time},等待时长:{(end_time - start_time).total_seconds()}")
def click_element(self, loc, img_doc, timeout=20, poll_frequency=0.5): # 等待元素可见 self.wait_ele_visible(loc, img_doc, timeout, poll_frequency) # 查找元素 ele = self.get_element(loc, img_doc) # 记录日志 do_log.info(f"{img_doc},点击{loc}元素。") # 点击元素 try: ele.click() # 失败了记录日志 except: do_log.exception(f"点击{loc}元素失败。") # 失败了截图 self._save_page_shot(img_doc) raise
def wait_ele_visiable(self, locator, img_doc, timeout=30, poll_fre=0.5): do_log.info("{},等待{}元素可见".format(img_doc, locator)) try: start_time = datetime.datetime.now() WebDriverWait(self.driver, timeout, poll_fre).until( EC.visibility_of_element_located(locator)) except: # 异常信息写入日志 do_log.exception("元素可见失败") # exception就是error级别,只不过输出的异常信息更为详细 # 截图 - 命名。 页面名称_行为名称_当前的时间.png self.sava_page_screenshot(img_doc) raise else: end_time = datetime.datetime.now() do_log.info("元素等待结束,开始时间为:{},结束时间为:{},等待时长为:{}".format( start_time, end_time, (start_time - end_time)))
def input_text(self, loc, text, img_doc, timeout=20, poll_frequency=0.5): # 等待元素可见 self.wait_ele_visible(loc, img_doc, timeout, poll_frequency) # 查找元素 ele = self.get_element(loc, img_doc) # 记录日志 do_log.info(f"{img_doc}在{loc}输入文本值:{text}。") # 输入文本内容 try: ele.send_keys(text) # 失败了记录日志 except: do_log.exception(f"{img_doc}在{loc}输入文本值:{text}失败。") # 失败了截图 self._save_page_shot(img_doc) raise
def get_element_text(self, locator, img_doc, timeout=30, poll_fre=0.5): # 等待元素存在; self.wait_page_contains_element(locator, img_doc, timeout, poll_fre) # 查找元素 ele = self.get_element(img_doc, locator) do_log.info("{},获取{}元素的文本内容.".format(img_doc, locator)) try: text = ele.text except: do_log.exception("获取元素文本内容失败") # 截图 - 命名。 页面名称_行为名称_当前的时间.png self.sava_page_screenshot(img_doc) raise else: do_log.info("获取的文本值为:{}".format(text)) return text
def clear_text(self, loc, img_doc, timeout=20, poll_frequency=0.5): # 等待元素可见 self.wait_ele_visible(loc, img_doc, timeout, poll_frequency) # 查找元素 ele = self.get_element(loc, img_doc) # 记录日志 do_log.info(f"{img_doc}在{loc}清空文本值。") # 输入文本内容 try: ele.clear() # 失败了记录日志 except: do_log.exception(f"{img_doc}在{loc}清空文本值失败。") # 失败了截图 self._save_page_shot(img_doc) raise
def check_element_visible(self,locator,img_doc,timeout=10,poll_fre=0.5): """ # 检测元素是否在页面存在且可见。 如果退出元素存在,则返回True。否则返回False :return: 布尔值 """ do_log.info("{}: 检测元素 {} 存在且可见于页面。".format(img_doc,locator)) try: WebDriverWait(self.driver,timeout,poll_fre).until(EC.visibility_of_element_located(locator)) except: do_log.exception(" {}秒内元素在当前页面不可见。".format(timeout)) self._save_page_shot(img_doc) return False else: do_log.info(" {}秒内元素可见。".format(timeout)) return True
def get_element_attribute(self, locator, attr, img_doc): #等待元素存在 self.wait_page_contains_element(img_doc, locator) #查找元素 ele = self.get_element(img_doc, locator) do_log.info("{},获取{}元素的属性{}.".format(img_doc, locator, attr)) try: value = ele.get_attribute(attr) except: # 异常信息写入日志 do_log.exception("获取元素属性失败:") # 级别:Error tracebak的信息完整的写入日志。 # 截图 - 命名。 页面名称_行为名称_当前的时间.png self.save_page_screenshot(img_doc) raise else: do_log.info("获取的属性值为: {}".format(value)) return value
def get_text(self, loc, img_doc, timeout=20, poll_frequency=0.5): # 等待元素可见 self.wait_ele_visible(loc, img_doc, timeout, poll_frequency) # 查找元素 ele = self.get_element(loc, img_doc) # 记录日志 do_log.info(f"{img_doc}获取元素{loc}的文本值。") # 输入文本内容 try: value = ele.text # 失败了记录日志 except: do_log.exception(f"{img_doc}获取元素{loc}的文本值失败。") # 失败了截图 self._save_page_shot(img_doc) raise else: do_log.info(f"文本值为:{value}") return value
def wait_page_contains_element(self, locator, img_doc, timeout=30, poll_fre=0.5): do_log.info("{},等待{}元素存在".format(img_doc, locator)) try: start_time = datetime.datetime.now() WebDriverWait(self.driver, timeout, poll_fre).until( EC.visibility_of_element_located(locator)) except: do_log.exception("等待元素存在失败") # 截图 - 命名。 页面名称_行为名称_当前的时间.png self.sava_page_screenshot(img_doc) raise else: end_time = datetime.datetime.now() do_log.info("元素等待结束,开始时间为:{},结束时间为:{},等待时长为{}".format( start_time, end_time, (start_time - end_time)))
def get_element_attribute(self, loc, attr_name, img_doc, timeout=20, poll_frequency=0.5): # 等待元素可见 self.wait_ele_visible(loc, img_doc, timeout, poll_frequency) # 查找元素 ele = self.get_element(loc, img_doc) # 记录日志 do_log.info(f"{img_doc}获取元素{loc}的{attr_name}属性。") # 输入文本内容 try: value = ele.get_attribute(attr_name) # 失败了记录日志 except: do_log.exception(f"{img_doc}获取元素{loc}的{attr_name}属性值失败。") # 失败了截图 self._save_page_shot(img_doc) raise else: do_log.info(f"属性值为:{value}") return value
def get_current_url(self): # 记录日志 do_log.info("获取当前页面的url。") try: value = self.driver.current_url # 失败了记录日志 except: value = do_log.exception(f"获取当前页面url失败。") raise else: do_log.info(f"当前页面的url为:{value}") return value
def switch_to_iframe(self, iframe_pref, img_doc, timeout=30): """ :param iframe_pref: :param img_doc: :param timeout: :return: """ """ 等待iframe可用,并切换进去。 :param iframe_pref: iframe的标识。支持下标、定位元组、WebElement对象、name属性 :return: 无 """ try: WebDriverWait(self.driver, timeout).until( EC.frame_to_be_available_and_switch_to_it(iframe_pref)) except: # 日志 do_log.exception("切换到 {} 的iframe元素:{} 失败!".format( img_doc, iframe_pref)) # 截图 self.save_web_screenshot(img_doc) raise else: time.sleep(0.5) do_log.info("切换到 {} 的iframe元素:{} 成功!可以对新的html页面操作了!".format( img_doc, iframe_pref)) # if __name__ == '__main__': # from selenium import webdriver # from selenium.webdriver.common.by import By # driver = webdriver.Chrome("D:\Tools\Chrome浏览器\Google\Chrome\Application\chromedriver.exe") # driver.get("http://www.baidu.com") # driver.maximize_window() # ele = (By.XPATH,'//input[@id="kwss"]') # BasePage(driver).wait_ele_visiable("百度搜索页面",ele)