""" ====================== Author: 柠檬班-小简 Time: 2020/8/28 20:27 Project: day3 Company: 湖南零檬信息技术有限公司 ====================== """ """ 1、等待元素可见 2、查找元素 3、点击操作:等待 - 查找 - 点击 4、输入操作:等待 - 查找 - 输入 5、获取元素文本:等待 - 查找 - 获取文本 6、获取元素属性:等待 - 查找 - 获取属性值 节省代码量、记录日志、失败截图 7、窗口切换 -- 让新窗口出现,获取所有句柄,切换到新窗口。 """ from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.remote.webdriver import WebDriver import os import time from Common.my_logger import logger from Common.handle_path import screenshot_dir class Basepage: def __init__(self,driver:WebDriver): self.driver = driver def wait_ele_visible(self, locator, page_action, timeout=20, poll_frequency=0.5): """ :param locator: :param page_action: :param timeout: :param poll_frequency: :return: """ logger.info("在 {} 行为,等待元素:{} 可见。".format(page_action,locator)) try: start = time.time() WebDriverWait(self.driver, timeout,poll_frequency).until(EC.visibility_of_element_located(locator)) except: # 输出到日志 logger.exception("等待元素可见失败!") # 失败截取当前页面 self.get_page_img(page_action) raise else: end = time.time() logger.info("等待耗时为:{}".format(end - start)) def wait_page_contains_element(self, locator, page_action, timeout=20, poll_frequency=0.5): """ :param locator: :param page_action: :param timeout: :param poll_frequency: :return: """ logger.info("在 {} 行为,等待元素:{} 存在。".format(page_action,locator)) try: start = time.time() WebDriverWait(self.driver, timeout,poll_frequency).until(EC.presence_of_element_located(locator)) except: # 输出到日志 logger.exception("等待元素存在失败!") # 失败截取当前页面 self.get_page_img(page_action) raise else: end = time.time() logger.info("等待耗时为:{}".format(end - start)) def get_element(self, locator, page_action,timeout=20, poll_frequency=0.5, wait_exist=False): """ :param locator: :param page_action: :param timeout: :param poll_frequency: :param wait: 默认是等待元素可见。 :return: """ # 先等待元素可见或者存在 if wait_exist is False: self.wait_page_contains_element(locator, page_action,timeout,poll_frequency) else: self.wait_ele_visible(locator, page_action,timeout,poll_frequency) logger.info("在 {} 行为,查找元素:{}".format(page_action,locator)) try: ele = self.driver.find_element(*locator) except: # 输出到日志 logger.exception("查找元素失败!") # 失败截取当前页面 self.get_page_img(page_action) raise else: return ele def click_element(self,locator, page_action,timeout=20, poll_frequency=0.5): # 等待 - 查找 ele = self.get_element(locator,page_action,timeout,poll_frequency) # 点击 logger.info("在 {} 行为,点击元素:{}".format(page_action,locator)) try: ele.click() except: logger.exception("点击元素失败!") self.get_page_img(page_action) raise def input_text(self,locator, page_action, value, timeout=20, poll_frequency=0.5): # 等待 - 查找 ele = self.get_element(locator, page_action, timeout, poll_frequency) logger.info("在 {} 行为,给元素:{} 输入文本值:{}".format(page_action, locator, value)) try: ele.clear() ele.send_keys(value) except: logger.exception("元素输入文本失败!") self.get_page_img(page_action) raise def get_text(self,locator, page_action, timeout=20, poll_frequency=0.5,wait_exist=False): """ :param locator: :param page_action: :param timeout: :param poll_frequency: :return: """ # 等待元素存在 - 查找 ele = self.get_element(locator, page_action, timeout, poll_frequency,wait_exist=wait_exist) logger.info("在 {} 行为,获取元素 {} 的文本值。".format(page_action, locator)) try: txt = ele.text except: logger.exception("获取元素文本失败!") self.get_page_img(page_action) raise else: logger.info("文本值为:{}".format(txt)) return txt def get_attribute(self,locator, page_action, attr, timeout=20, poll_frequency=0.5, wait_exist=False): # 等待元素存在 - 查找 ele = self.get_element(locator, page_action, timeout, poll_frequency, wait_exist=wait_exist) logger.info("在 {} 行为,获取元素 {} 的 {} 属性值。".format(page_action, locator,attr)) try: value = ele.get_attribute(attr) except: logger.exception("获取元素文本失败!") self.get_page_img(page_action) raise else: logger.info("属性值为:{}".format(value)) return value def get_page_img(self,page_action): # 命令规范: {XX页面_XX操作}_截图时间.png cur_time = time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime()) file_path = os.path.join(screenshot_dir,"{}_{}.png".format(page_action,cur_time)) self.driver.save_screenshot(file_path) logger.info("截图保存在:{}".format(file_path)) if __name__ == '__main__': from selenium import webdriver from time import sleep driver = webdriver.Chrome() base = Basepage(driver) driver.get("http://www.baidu.com") # 等待输入框可见 loc = ("id","kw") loc_button = ("id", "su") base.input_text(loc,"百度首页_输入搜索内容","selenium webdriver") base.click_element(loc_button,"百度首页_点击搜索按钮") sleep(7) driver.quit()