selenium基础

发布时间 2023-08-13 22:09:53作者: 暮雨星辰

Selenium

框架

Python+Selenium+Pytest+Mysql+openpyxl

image-20230812142939912

配置相关

import pathlib


class Config():
    # 当前的文件路径
    current_path = pathlib.Path(__file__).absolute()
    # root
    root = current_path.parent.parent
    # 驱动路径
    driver_path = root / "drivers/chromedriver.exe"  # 谷歌浏览器驱动位置
    # 默认等待时间
    default_timeout = 5
    # 域名
    host = "测试网站"
    # 默认加载策略
    load_strategy = "eager"
    # 用户名
    user_mobile = "手机号"
    # 密码
    passwd = "密码"

    # Database
    database = dict(host="数据库IP地址",
                    port=端口号,
                    user="用户名",
                    password="密码",
                    database="数据库")

测试夹具-驱动封装

import pytest
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from config.setting import Config


@pytest.fixture()
def driver():
    driver_path = Config.driver_path  # 浏览器驱动地址
    option = Options()
    option.page_load_strategy = Config.load_strategy  # 页面加载策略
    d = webdriver.Chrome(executable_path=driver_path, options=option)
    d.implicitly_wait(Config.default_timeout)
    yield d
    time.sleep(3)
    d.quit()

Mysql数据库封装

import pymysql
from pymysql.cursors import DictCursor
from config.setting import Config


class DB:
    def __init__(self):
        self.conn = pymysql.connect(**Config.database)

    def query_one(self, sql):
        cursor = self.conn.cursor(cursor=DictCursor)
        cursor.execute(sql)
        result = cursor.fetchone()
        cursor.close()
        return result

    def query_all(self, sql):
        cursor = self.conn.cursor(cursor=DictCursor)
        cursor.execute(sql)
        result = cursor.fetchall()
        cursor.close()
        return result

    def close(self):
        """关闭数据库"""
        self.conn.close()

openpyxl封装

"""专门去操作Excel表格的"""
import openpyxl


def read_excel(file, sheet_name):
    workbook = openpyxl.load_workbook(file)
    sheet = workbook[sheet_name]
    items = list(sheet.values)
    title = items[0]
    new_list = [dict(zip(title, item)) for item in items[1:]]
    return new_list

Selenium常用操作方法

from selenium.webdriver import Chrome, ActionChains, Keys


class BasePage(object):

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

    def goto(self, url):
        """访问URL"""
        self.driver.get(url)

    def click(self, locator):
        """封装浏览器的点击操作"""
        el = self.driver.find_element(*locator)
        try:
            el.click()
        except:
            ActionChains(self.driver).click(el).perform()

    def send_keys(self, words, locator=None):
        # 输入
        if locator:
            el = self.driver.find_element(*locator)
            # 相当于 ActionChains 里面的 send_keys_to_element
            # 先点击元素el,再然后在输入内容,先会有光标的聚焦
            el.send_keys(words)
            return
        else:
            ActionChains(self.driver).send_keys(words).perform()

    def assert_text_equal(self, locator, expected):
        """断言元素的文本"""
        el = self.driver.find_element(*locator)
        assert el.text == expected

    # 把所有的浏览器常用操作都封装成现成的方法直接使用
    def double_click(self, locator):
        """双击"""
        el = self.driver.find_element(*locator)
        ActionChains(self.driver).double_click(el).perform()

    def drag_and_drop(self, locator1, locator2):
        """鼠标拖动"""
        el1 = self.driver.find_element(*locator1)
        el2 = self.driver.find_element(*locator2)
        ActionChains(self.driver).drag_and_drop(el1, el2).perform()

    def press_enter(self):
        """回车"""
        ActionChains(self.driver).send_keys(Keys.ENTER).perform()

    def copy(self):
        """复制"""
        action = ActionChains(self.driver)
        action.key_down(Keys.CONTROL).send_keys("c").key_up(Keys.CONTROL).perform()

    def paste(self):
        """粘贴"""
        action = ActionChains(self.driver)
        action.key_down(Keys.CONTROL).send_keys("v").key_up(Keys.CONTROL).perform()

    def scroll_to_bottom(self):
        """滚动到窗口底部"""
        script = 'window.scrollTo(0, document.body.scrollHeight)'
        self.driver.execute_script(script)

    def switch_to_iframe(self, locator):
        """切换iframe"""
        self.driver.switch_to.frame(*locator)