初探自动化测试框架(python)第一章——selenium二次封装

你的输入习惯决定你的封装方式

QUESTION1:必须对原有selenium进行二次封装吗?

  • 其实不是必然的,selenium有肥肠庞大的功能操作群,我们进行二次封装时,大概率的会遗忘掉某些功能,不常用但是至关重要。比如:driver.find_element_by_id(value1).find_element_by_id(value2).click(),如果你愿意这个链子你可以写的更长。显而易见的是你肯定不会封装这种无限期的函数,于是某一天的清晨你突发奇想找到了方法,用封装的ELEMENT()和CLICK()函数曲线救国:ELEMENT().CLICK(),恭喜你,你可以去验证你的成果了。
  • 所以封装就没有必要了吗?我总是不习惯于每次的find_element_by_id相关输入,太长了有木有!尤其是每次改ID,NAME,XAPATH的时候很麻烦的有木有。所以痛定思痛,我还是对selenium下手了。

QUESTION2:如何封装才能更便于使用呢?

  • 最初的版本封装的非常简陋,以至于每次遇到问题的时候都要去完善之前的版本,包括iframe,链式,JS操作等等。所以最重要的一条是***尽量完善你的封装类***让他包罗万象,足以处理你将面临的绝大部分问题。接下来你会问,不便于封装的方法怎么办?
  • 我想到的答案是将操作浏览器的方法单独封装,然后作为参数传入到你的Basic()中,即你二次封装selenium类。如此一来的问题就是,每次实例化的时候,你都需要进行2布,首先实例化browser()并将其当作参数传入到Basic()中,曲线救国。
  • 其次加入一些异常处理,比如抛出未找到元素的异常等等。
  • 只能等待,你值得拥有!

一下是我封装的一些方法,仅供参考。

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait

def browser(browser = None):
    if browser == 'ie':
        driver = webdriver.Edge(EDGE_PATH)
    elif browser == 'firefox':
        driver = webdriver.Firefox(FIRFOX_PATH)
    elif browser == 'opera':
        driver = webdriver.Opera(OPERA_PATH)
    else:
        driver = webdriver.Chrome(CHROME_PATH)
    return driver


class Basic():
    def __init__(self,driver):
        self.driver = driver

    def open(self, url, time=15):
        """最大化打开网页"""
        self.driver.implicitly_wait(time)
        self.driver.maximize_window()
        self.driver.get(url)

    def element(self, type, value, timeout=10):
        """定位元素"""
        try:
            if type == 'xpath':
                element = WebDriverWait(
                    self.driver, timeout, 1).until(
                    EC.presence_of_element_located(
                        (By.XPATH, value)))
                return element
            elif type == 'id':
                element = WebDriverWait(
                    self.driver, timeout, 1).until(
                    EC.presence_of_element_located(
                        (By.ID, value)))
                return element
            elif type == 'name':
                element = WebDriverWait(
                    self.driver, timeout, 1).until(
                    EC.presence_of_element_located(
                        (By.NAME, value)))
                return element
            elif type == 'class':
                element = WebDriverWait(
                    self.driver, timeout, 1).until(
                    EC.presence_of_element_located(
                        (By.CLASS_NAME, value)))
                return element
            elif type == 'link':
                element = WebDriverWait(
                    self.driver, timeout, 1).until(
                    EC.presence_of_element_located(
                        (By.LINK_TEXT, value)))
                return element
            elif type == 'css':
                element = WebDriverWait(
                    self.driver, timeout, 1).until(
                    EC.presence_of_element_located(
                        (By.CSS_SELECTOR, value)))
                return element
        except BaseException:
            print("%s 页面未找到元素 %s" % (self, value))

    def elements(self, type, value, timeout=10):
        """定位一组元素"""
        try:
            if type == 'xpath':
                elements = WebDriverWait(
                    self.driver, timeout, 1).until(
                    EC.presence_of_all_elements_located(
                        (By.XPATH, value)))
                return elements
            elif type == 'id':
                elements = WebDriverWait(
                    self.driver, timeout, 1).until(
                    EC.presence_of_all_elements_located(
                        (By.ID, value)))
                return elements
            elif type == 'name':
                elements = WebDriverWait(
                    self.driver, timeout, 1).until(
                    EC.presence_of_all_elements_located(
                        (By.NAME, value)))
                return elements
            elif type == 'class':
                elements = WebDriverWait(
                    self.driver, timeout, 1).until(
                    EC.presence_of_all_elements_located(
                        (By.CLASS_NAME, value)))
                return elements
            elif type == 'link':
                elements = WebDriverWait(
                    self.driver, timeout, 1).until(
                    EC.presence_of_all_elements_located(
                        (By.LINK_TEXT, value)))
                return elements
            elif type == 'css':
                elements = WebDriverWait(
                    self.driver, timeout, 1).until(
                    EC.presence_of_all_elements_located(
                        (By.CSS_SELECTOR, value)))
                return elements
        except BaseException:
            print("%s 页面未找到元素 %s" % (self, value))

    def clear(self, type, value):
        """清除文本框"""
        element = self.element(type, value)
        element.clear()

    def text(self, type, value):
        """获取文本内容"""
        element = self.element(type, value)
        return element.text

    def get_attribute(self, type, value, name):
        """获得属性"""
        element = self.element(type, value)
        return element.get_attribute(name)

    def location(self, type, value):
        """获得元素坐标"""
        element = self.element(type, value)
        return element.location

    def size(self, type, value):
        """获取元素尺寸"""
        element = self.element(type, value)
        return element.size

    def save_screenshot(self, filename):
        """截图"""
        self.driver.save_screenshot(filename)

    def current_url(self):
        """获取当前URL"""
        return self.driver.current_url

    def title(self):
        """获取当前title"""
        return self.driver.title

    def quit(self):
        """关闭浏览器"""
        return self.driver.quit()

    def close(self):
        """关闭窗口"""
        return self.driver.close()

    def forward(self):
        """前进"""
        return self.driver.forward()

    def back(self):
        """后退"""
        return self.driver.back()

    def refresh(self):
        """刷新"""
        return self.driver.refresh()

    def click(self, type, value):
        """单击"""
        element = self.element(type, value)
        element.click()

    def input(self, type, value, text):
        """清除输入框内容并发送文本"""
        element = self.element(type, value)
        # element.clear()
        element.send_keys(text)

    def space(self, type, value):
        element = self.element(type, value)
        element.send_keys(Keys.SPACE)

    def esc(self, type, value):
        element = self.element(type, value)
        element.send_keys(Keys.ESCAPE)

    def enter(self, type, value):
        element = self.element(type, value)
        element.send_keys(Keys.ENTER)

    def jump(self):
        """页面跳转"""
        old_handle = self.driver.current_window_handle
        handles = self.driver.window_handles
        for handle in handles:
            if handle != old_handle:
                self.driver.switch_to.window(handle)


  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值