思想:

●页面封装也可以使用组件方式。比如导航object, footer object等在多个页面重复出现的,使用组件可以增强
代码复用性。

简单来说就是封装导航栏中的每个页面,将通用的页面操作封装成basepage

举例:

将不属于该登录页面的操作拿出来,单独再封装个类

 

 

 在conftest补充实例化,方便调用

 

 

 这样page里就有两个页面了

 

 

 在写用例时继承了哪个页面就比较清晰

 数据驱动:

 

 

 

 封装公用的url

 

 

封装通用的浏览器操作:

from selenium.webdriver import Chrome, ActionChains, Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as when
from setting import config


class Page:
    """通用操作

    1、键盘操作
    2、文件上传
    3、双击
    4、鼠标悬停
    5、右击
    6、拖动
    7、多种快捷键的封装
    8、设置某个页面的属性
    9、iframe
    10、窗口的滚动
    11、元素的滚动
    12、单选框,多选款, check
    13
    """
    host = config.host

    def __init__(self, driver: Chrome):
        self.browser = driver

    def goto(self, url):
        """去哪个url地址"""
        # url = http://wefoweowef
        if url.find('http://') != -1:
            return self.browser.get(url)
        return self.browser.get(self.host + url)

    def fill(self, locator, words):
        """输入框当中填入"""
        el = self.browser.find_element( *locator )
        el.send_keys(words)

    def click(self, locator):
        """点击"""
        wait = WebDriverWait(self.browser, timeout=5)
        condition = when.element_to_be_clickable( locator )
        element = wait.until(condition)
        # 点击操作的封装最好使用 ActionChains
        ActionChains(self.browser).click(element).perform()

    def double_click(self, locator):
        """双击"""
        wait = WebDriverWait(self.browser, timeout=5)
        condition = when.element_to_be_clickable(locator)
        element = wait.until(condition)
        # 点击操作的封装最好使用 ActionChains
        ActionChains(self.browser).double_click(element).perform()

    def drag_and_drop(self, locator1, locator2):
        """双击"""
        wait = WebDriverWait(self.browser, timeout=5)
        condition = when.element_to_be_clickable(locator1)
        element1 = wait.until(condition)

        condition = when.element_to_be_clickable(locator2)
        element2 = wait.until(condition)
        # 点击操作的封装最好使用 ActionChains
        ActionChains(self.browser).drag_and_drop(element1, element2).perform()

    def is_loaded(self, url, timeout=10):
        """判断某个 url 是否被加载"""
        return WebDriverWait(self.browser, timeout).until(when.url_contains(url))

    def get_element_attribute(self, locator, name):
        """获取某个元素的属性"""
        el = self.browser.find_element(*locator)
        return el.get_attribute(name)

    def enter(self):
        """回车"""
        return ActionChains(self.browser).send_keys(Keys.ENTER).perform()

    def copy(self):
        """复制的快捷键"""
        actions = ActionChains(self.browser)
        actions.key_down(Keys.CONTROL)
        actions.send_keys('c')
        actions.key_up(Keys.CONTROL).perform()

    def paste(self):
        """复制的快捷键"""
        actions = ActionChains(self.browser)
        actions.key_down(Keys.CONTROL)
        actions.send_keys('v')
        actions.key_up(Keys.CONTROL).perform()

    def set_attribute(self,locator, name, value):
        """设置元素属性"""
        el = self.browser.find_element(*locator)
        # "arguments[0].value='2021-12-07'"
        js = f'arguments[0].{name} = "{value}"'
        self.browser.execute_script(js, el)

    def switch_to_iframe(self, locator, timeout=10):
        """切换iframe"""
        # iframe = self.browser.find_element(*locator)
        # self.browser.switch_to.frame(iframe)
        wait = WebDriverWait(self.browser, timeout)
        wait.until(when.frame_to_be_available_and_switch_to_it(locator))

    def switch_to_default(self):
     """切换到主页""" self.browser.switch_to.default_content()
def scroll_to_bottom(self): """滚动到页面底部""" js = f'window.scrollTo(0, document.body.scrollHeight)' self.browser.execute_script(js) def check(self, locator): """找到选项,点击""" pass

封装好基本的浏览器操作就可以在写其它页面时继承这个类就好了

 

 

basepage的作用:
对selenium 封装浏览器操作进行二次封装(二次开发),让整个浏览器的操作变的更加容易使用。

我们其他页面对象直接继承 basepage, 后期重点维护 basepage 操作。

posted on 2021-12-08 17:18  熊猫星人  阅读(175)  评论(0编辑  收藏  举报