webui自动化中封装一个基类,主要内容元素查找,点击,输入,切换窗口,鼠标等

继上篇搭建webui目录后学习
1,在common包下新建一个driver.py文件
目的是因为:每一个获取元素都需要创建一个

class GlobalDriver:
    # 定义类属性 代表所有的公共driver对象
    driver = None # 去哪里赋值呢 fixture
# 元素查找、点击、输入、切换窗口、frame、alert、鼠标等核心代码
class InitDriver:
    def __init__(self,browser='chrome',remote_url=None):
        self.logger = GetLogger().get_logger()
        # self.driver = webdriver.Chrome()
        if remote_url != None:
            if browser.lower()=='chrome':
                options=webdriver.ChromeOptions()
            elif browser.lower()=='firefox':
                options = webdriver.FirefoxOptions()
            elif browser.lower()== 'ie':
                options = webdriver.IeOptions()
            self.driver=webdriver.Remote(remote_url,desired_capabilities=options.to_capabilities())
        else:
            if browser.lower() == 'chrome':
                self.driver = webdriver.Chrome()
            elif browser.lower() == 'firefox':
                self.driver = webdriver.Firefox()
            elif browser.lower() == 'ie':
                self.driver = webdriver.Ie()
            elif browser.lower() == 'safari':
                self.driver = webdriver.Safari()
            self.driver.maximize_window()
            self.logger.info('浏览器初始化')
    def get(self,url):
        self.driver.get(url)

    def find_element(self,ele_info):
        # 名称、定位方法、属性值/文本/表达式、时间等待
        # {'name':'登录按钮','type':'linktext','value':'登录','timeout':5}
        # 解析 ele_info
        name = ele_info['name']
        type = ele_info['type']
        value = ele_info['value']
        timeout = ele_info['timeout']
        # self.driver.find_element(By.LINK_TEXT,'登录')
        locator =self.getBy(ele_info)

        try:
            wait = WebDriverWait(driver=self.driver, timeout=timeout)
            element = wait.until(EC.presence_of_element_located(locator))
            self.logger.info('查找【{}】使用【{},{}】定位成功'.format(name,type,value))
        except Exception as e:
            self.logger.info('查找【{}】使用【{},{}】定位失败,原因:{}'.format(name, type, value,e))
            raise Exception('查找【{}】使用【{},{}】定位失败,原因:{}'.format(name, type, value,e))
        return element

    # 元素定位 针对不同方法封装  返回(By.LINK_TEXT,'xxxx')类型数据
    def getBy(self,ele_info):
        type = ele_info['type']
        value = ele_info['value']
        if type=='id':
            locator = (By.ID,value)
        elif type=='name':
            locator = (By.NAME, value)
        elif type=='classname':
            locator = (By.CLASS_NAME, value)
        elif type=='linktext':
            locator = (By.LINK_TEXT, value)
        elif type=='partial_link_text':
            locator = (By.PARTIAL_LINK_TEXT, value)
        elif type == 'tagname':
            locator = (By.TAG_NAME, value)
        elif type == 'css':
            locator = (By.CSS_SELECTOR, value)
        elif type == 'xpath':
            locator = (By.XPATH, value)
        else:
            raise Exception(f'{type}不支持这种方式')
        return locator
    # 点击
    def click(self, ele_info):
        # element = self.find_element(ele_info)
        # element.click()
        # 点击元素拦截  加入时间等待机制-显式等待
        name = ele_info['name']
        # type = ele_info['type']
        # value = ele_info['value']
        timeout = ele_info['timeout']
        locator = self.getBy(ele_info)
        try:
            wait = WebDriverWait(driver=self.driver, timeout=timeout)
            wait.until(element_click_success(locator))
        except Exception as e:
            raise Exception('点击【{}】失败,原因:{}'.format(name, e))

    # 输入
    def send_keys(self,ele_info,text):
        element = self.find_element(ele_info)
        element.send_keys(text)

        # 清空
    def clear(self, ele_info):
        element = self.find_element(ele_info)
        element.clear()

     # 鼠标悬浮
    def move_to_element(self,ele_info):
        element = self.find_element(ele_info)
        action=ActionChains(self.driver)
        action.move_to_element(element).perform()

    # 窗口切换
    def switch_to_window(self,index=-1):
        handles = self.driver.window_handles
        self.driver.switch_to.window(handles[index])

    # 断言-是否包含某段文字
    def page_contains(self,text):
        try:
            # 判断提示语在时间段内是否出现
            # 通过显式等待 增加自定义函数-匿名函数
            wait = WebDriverWait(driver=self.driver,timeout=10)
            wait.until(lambda x:text in x.page_source)
            return True
        except Exception as e:
            self.logger.debug('判断页面包含【{}】,失败原因:{}'.format(text,e))
            return False

    # 获取某个属性方法
    def get_attribute(self,ele_info,attr_name):
        element = self.find_element(ele_info)
        return element.get_attribute(attr_name)

    # 新增页面刷新
    def refresh(self):
        self.driver.refresh()

    # 截图方法  返回结果二进制对象  不存储文件
    def get_screenshot_as_png(self):
        return self.driver.get_screenshot_as_png()

    # 截图方法 存储文件
    def get_screenshot_as_file(self,filename):
        return self.driver.get_screenshot_as_file(filename)
    # 关闭 quit  断开
    def quit(self):
        self.driver.quit()

# 定位元素并并点击 如果没有异常返回True
class element_click_success(object):
    def __init__(self, locator): #
        self.locator = locator # locator 指的是定位方式 和表达式或属性 (By.xpath,'XXX')
    def __call__(self, driver): # call 把类变成可用对象 - 当前类作为函数对象 实现元素定位及点击
        element = driver.find_element(*self.locator) # 元组  接受多个参数 拆包
        try:
            element.click()
            print('元素查找并点击')
            return True
        except:
            return False

if __name__ == '__main__':
    driver = InitDriver()
    driver.get('http://xxxx:8080/')
    eleinfo = {'name':'登录按钮','type':'linktext','value':'登录','timeout':5}
    driver.click(eleinfo)
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值