python+selenium自动化测试关键字驱动

这篇具有很好参考价值的文章主要介绍了python+selenium自动化测试关键字驱动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、selenium常用方法封装(baseselenium.py)

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import os
from Common.log_utils import LogUtils
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
import pyperclip
import allure
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

class driver():
    # 调用浏览器,可以考虑写到conftest.py
    def open_browser(self, browser_type):
        options = webdriver.ChromeOptions()
        options.add_experimental_option('excludeSwitches', ['enable-automation'])
        if browser_type == 'chrome':
            driver = webdriver.Chrome(options=options)
            return driver
        elif browser_type == 'firefox':
            driver = webdriver.firefox()
        else:
            print('type error')

class BaseSelenium(object):
    def __init__(self, driver):
        """WebDriver需以参数的形式传入,否则运行时会导致多个浏览器窗口被打开"""
        self.driver = driver
        """log类实例化"""
        self.log = LogUtils()


    # 调用浏览器
    def open_browser(self, browser_type):
        options = webdriver.ChromeOptions()
        options.add_experimental_option('excludeSwitches', ['enable-automation'])
        if browser_type == 'chrome':
            driver = webdriver.Chrome(options=options)
            return driver
        elif browser_type == 'firefox':
            driver = webdriver.firefox()
        else:
            print('type error')

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

    "传入URL,最大化窗口"
    def open_url(self, url):
        self.driver.maximize_window()
        self.url = "https://%s" % url
        self.driver.get(self.url)

    "获取title"
    def get_title(self):
        self.log.info("获取页面title")
        try:
            self.log.info("当前页面title为:{}".format(self.driver.title))
            return self.driver.title
        except Exception as e:
            self.log.error("获取页面title失败{}".format(e))
            self.screenshot_save()

    "获取页面元素"

    def get_element(self, *args):
        sleep_time = 10
        frequency = 0.5
        if args is not None:
            try:
                # 显式等待,等待元素可见
                element = WebDriverWait(self.driver, sleep_time, frequency).until(
                    EC.visibility_of_element_located(*args)
                )
            except Exception as e:
                self.log.error("查找元素{}失败:{}".format(args, e))
            else:
                return element
        else:
            self.log.error("element value is NUll")

    def get_elements(self, *args):
        sleep_time = 10
        frequency = 0.5
        if args is not None:
            try:
                # 显式等待,等待元素可见
                elements = WebDriverWait(self.driver, sleep_time, frequency).until(
                    EC.visibility_of_all_elements_located(*args)
                )
            except Exception as e:
                self.screenshot_save()
                self.log.error("查找元素{}失败:{}".format(args, e))
            else:
                return elements
        else:
            self.log.error("element value is NUll")

    "获取页面元素"

    def get_element_presence(self, *args):
        sleep_time = 10
        frequency = 0.5
        if args != None:
            try:
                # 显式等待,等待元素存在
                element = WebDriverWait(self.driver, sleep_time, frequency).until(
                    EC.presence_of_element_located(*args)
                )
            except Exception as e:
                self.screenshot_save()
                self.log.error("查找元素{}失败:{}".format(*args, e))
            else:
                return element
        else:
            self.log.error("element value is NUll")

    "等待元素可点击"

    def element_clickable(self, *args):
        sleep_time = 10
        frequency = 0.5
        if args != None:
            try:
                # 显式等待,等待元素可点击
                element = WebDriverWait(self.driver, sleep_time, frequency).until(
                    EC.element_to_be_clickable(*args)
                )
                if element:
                    return element
                else:
                    self.screenshot_save()
            except Exception as e:
                self.screenshot_save()
                self.log.error("查找元素{}失败:{}".format(args, e))
        else:
            self.log.error("element value is NUll")

    def click_clickable(self, name=None, *args):
        try:
            element = self.get_element(*args)
            print(element)
            element.click()
        except Exception as e:
            self.screenshot_save()
            self.log.error("{}元素[{}]点击失败".format(name, e))
        else:
            self.log.info("点击{},元素[{}]点击成功".format(name, *args))

    "模拟键盘输入方法重写"
    def send_key(self, value, *args):
        if args is not None:
            if value is not None and value != 'None':
                try:
                    element = self.get_element(*args)
                    element.send_keys(str(value))
                    self.log.info("输入值:{}".format(value))
                except:
                    try:
                        element = self.get_element_presence(*args)
                        element.send_keys(str(value))
                        self.log.info("二次尝试输入值:{}".format(value))
                    except Exception as e:
                        self.log.error("输入错误:{}{}".format(value, e))
                        self.screenshot_save()
            else:
                self.log.warning("没有传入字符串,或输入为空")
        else:
            self.log.error("没有传入元素")

    "重写清空输入框方法"

    def clear_value(self, *args):
        if args is not None:
            try:
                element = self.get_element(*args)
                element.clear()
                self.log.info("清除输入框{}成功".format(*args))
            except Exception as e:
                self.log.error("清除输入框{}失败".format(e))
                self.screenshot_save()
        else:
            self.log.error("没有传入元素")

    "重写模拟鼠标悬停方法"

    def mouse_move(self, *args):
        try:
            action = self.get_element_presence(*args)
            ActionChains(self.driver).move_to_element(action).perform()
            self.log.info("鼠标移动到元素{}成功".format(*args))
        except Exception as e:
            self.log.error("鼠标移动至元素:{}失败".format(e))
            self.screenshot_save()

    def double_click(self, name, *args):
        if args:
            try:
                ele = self.get_element(*args)
                ActionChains(self.driver).double_click(ele).perform()
                self.log.info("双击{}成功".format(name))
            except Exception as e:
                self.log.error('双击元素{}失败{}:'.format(args, e))
                self.screenshot_save()
        else:
            self.log.error('传入元素为空')

    "重写表单提交方法"

    def text_submit(self, *args):
        try:
            ele = self.get_element(*args)
            ele.submit()
            self.log.info("表单{}提交成功".format(*args))
        except Exception as e:
            self.log.error("表单{}提交失败".format(e))
            self.screenshot_save()

    "重写页面文字获取方法"

    def get_text(self, *args):
        try:
            text = self.get_element(*args).text
            self.log.info("获取文字 {} 成功".format(text))
            return text
        except Exception as e:
            self.log.error("获取文字失败!{},尝试二次获取".format(e))
            try:
                text = self.get_element_presence(*args).text
                self.log.info("获取文字 {} 成功".format(text))
                return text
            except Exception as e:
                self.log.error("二次获取文字失败!{}".format(e))
                self.screenshot_save()

    "多元素文字匹配"

    def get_texts(self, *args):
        text = []
        try:
            for ele in self.get_elements(*args):
                text.append(ele.text)
        except Exception as e:
            self.log.error("获取文字失败!{}".format(e))
            self.screenshot_save()
        else:
            self.log.info("获取文字 {} 成功".format(text))
            return text

    "重写页面截图方法"
    def screenshot_save(self, name=None):
        p = os.path.abspath(os.path.dirname(os.getcwd()) + os.path.sep )   #xxx路径
        path=p+r'\xxx\Outputs\logs'
        # print(path)
        if name:
            try:
                file_path = os.path.join(path, name +
                                         time.strftime("%Y.%m.%d-%H-%M-%S") + '.png')
                self.driver.save_screenshot(file_path)
                allure.attach(file_path, name, allure.attachment_type.PNG)
                self.log.info("页面[{}]截图成功".format(self.get_url()))
            except Exception as e:
                self.log.error("截图失败{}".format(e))
        else:
            try:
                file_path = os.path.join(path,
                                         time.strftime("%Y.%m.%d-%H-%M-%S") + '.png')
                self.driver.save_screenshot(file_path)
                self.log.info("页面[{}]截图成功".format(self.get_url()))
            except Exception as e:
                self.log.error("截图失败{}".format(e))

    "重写获取当前页面URL方法"

    def get_url(self):
        url = self.driver.current_url
        if url:
            try:
                self.log.info("获取URL[{}]成功".format(url))
                return url
            except Exception as e:
                self.log.error("获取URL失败{}".format(e))
        else:
            self.log.error("获取url失败")

    "重写点击元素方法"

    def click_element(self, name=None, *args):
        try:
            element = self.get_element(*args)
            element.click()
            self.log.info("点击{},元素[{}]点击成功".format(name, *args))
        except Exception as e:
            self.log.error("{}元素[{}]第一次点击失败".format(name, e))
            try:
                self.log.info('切换到元素存在')
                self.element_presence_click(name, *args)
            except Exception as e:
                self.log.error("{}元素[{}]第二次点击失败".format(name, e))
                self.screenshot_save()
                try:
                    self.log.info('切换到js点击')
                    self.js_click(name, *args)
                except Exception as e:
                    self.log.error("{}元素[{}]第三次点击失败".format(name, e))
                    self.screenshot_save()

    # 获取元素值
    def get_attribute(self, name, *args):
        try:
            attribute = self.get_element(*args).get_attribute(name)
            if attribute:
                self.log.info("获取元素{}成功:{}".format(name, attribute))
                return attribute
        except Exception as e:
            self.log.warning(e)
            self.screenshot_save(name)

    # 模拟回车方法
    def keys_enter(self, *args):
        try:
            ele = self.get_element(*args)
            ele.send_keys(Keys.ENTER)
            self.log.info("元素{}回车成功".format(args))
        except Exception as e:
            self.log.error("模拟回车失败,原因:{}".format(e))
            self.screenshot_save()

    # 模拟输入框全选删除
    def keys_delete(self, *args):
        try:
            ele = self.get_element(*args)
            ele.send_keys(Keys.CONTROL + "a")
            ele.send_keys(Keys.BACKSPACE)
        except Exception as e:
            self.log.error("删除失败{}".format(e))
            self.screenshot_save()

    # 获取剪切板信息
    def get_paste(self, *args):
        try:
            ele = self.get_element(*args)
            ele.send_keys(Keys.CONTROL + "a")
            ele.send_keys(Keys.CONTROL + "c")
            vls = pyperclip.paste()
            self.log.info("获取剪切板信息成功:{}".format(vls))
            return vls
        except Exception as e:
            self.log.error("获取剪切板失败:{}".format(e))

    # 删除html属性
    def remove_art(self, js_path, art_name):
        js = '{}.removeAttribute("{}");'.format(js_path, art_name)
        try:
            self.driver.execute_script(js)
            self.log.info('运行删除{}属性js脚本成功'.format(art_name))
        except Exception as e:
            self.log.error('运行删除#{}#js脚本失败{}'.format(art_name, e))

    # 通过js点击
    def js_click(self, name, *args):
        element = self.get_element(*args)
        try:
            self.driver.execute_script("arguments[0].click();", element)
            self.log.info('点击{}成功'.format(name))
        except Exception as e:
            self.log.error('通过js点击{}元素{}失败'.format(name, e))

    def js_get_text(self, *args):
        element = self.get_element_presence(*args)
        try:
            res = self.driver.execute_script("arguments[0].getInnerHTML();", element)
            self.log.info('获取{}成功'.format(res))
        except Exception as e:
            self.log.error('通过js获取{}元素{}失败'.format(*args, e))
        else:
            return res

    # 使用selenium默认的点击
    def default_click(self, name, args):
        try:
            element = self.driver.find_element(*args)
            element.click()
        except Exception as e:
            self.log.error('元素{}点击失败:{}'.format(*args, e))
        else:
            self.log.info('不加任何等待,直接点击:{}'.format(name))

    # 等待元素存在时点击
    def element_presence_click(self, name, *args):
        try:
            element = self.get_element_presence(*args)
            element.click()
        except Exception as e:
            self.log.error("点击{}元素[{}]点击失败".format(name, e))
        else:
            self.log.info("点击{},元素[{}]点击成功".format(name, *args))

二、页面层(调用基类进行页面元素定位,页面操作)

page1

######项目页面
from PageObjects.BaseSelenium import BaseSelenium
from selenium.webdriver.common.by import By
class Tt(BaseSelenium):
    # def __init__(self,browser_type='chrome',url = 'www.baidu.com'):
    #     super(Tt, self).__init__(browser_type='chrome',url = 'www.baidu.com')
    def test_baidu(self,key):
        self.send_key(key, (By.ID, 'kw'))
        self.element_presence_click('点击百度一下',(By.ID,'su'))

    def clear(self):
        self.clear_value((By.ID, 'kw'))


page2文章来源地址https://www.toymoban.com/news/detail-507651.html

######项目页面
from PageObjects.BaseSelenium import BaseSelenium
from selenium.webdriver.common.by import By
class Tt1(BaseSelenium):
    # def __init__(self,browser_type='chrome',url = 'www.baidu.com'):
    #     super(Tt1, self).__init__(browser_type='chrome',url = 'www.baidu.com')
    def test_baidu1(self):
        self.send_key('222', (By.ID, 'kw'))
        self.element_presence_click('点击百度一下',(By.ID,'su'))

    def clear(self):
        self.clear_value((By.ID, 'kw'))

三、用例层(调用页面层组合成用例)

from PageLocators.page import Tt
from PageLocators.page1 import Tt1
from PageObjects.BaseSelenium import driver
from selenium.webdriver.common.by import By
class Test_1():
    def setup_class(self):
        d=driver().open_browser('chrome')
        self.baidu = Tt(d)
        self.baidu1 = Tt1(d)
        self.baidu.open_url(url='www.baidu.com')

    def test1(self):
        self.baidu.test_baidu('LZP')
        time.sleep(2)
        self.baidu.clear_value((By.ID, 'kw'))

    def test2(self):
        self.baidu1.test_baidu1()
        time.sleep(2)
        self.baidu1.clear()

    def test3(self):
        self.baidu.test_baidu('LP')
        time.sleep(2)
        self.baidu.clear()

    def teardown_class(self):
        self.baidu.quit()
if __name__=='__main__':
    pytest.main(['-s','test.py','-W','ignore:Module already imported:pytest.PytestWarning'])

到了这里,关于python+selenium自动化测试关键字驱动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据驱动 vs 关键字驱动:对搭建UI自动化测试框架的探索

    UI自动化测试用例剖析 让我们先从分析一端自动化测试案例的代码开始我们的旅程。以下是我之前写的一个自动化测试的小Demo。这个Demo基于Selenium与Java。由于现在Selenium在自动化测试的统治地位,并且随着Selenium 4的即将发布,在未来很长的一段时间里这种统治地位应该还会

    2024年02月19日
    浏览(42)
  • 【软件测试】UI自动化框架,数据驱动 vs 关键字驱动怎么选

    让我们先从分析一端自动化测试案例的代码开始我们的旅程。以下是我之前写的一个自动化测试的小Demo。这个Demo 基于Selenium与Java 。 自动化测试小Demo 它要测试的东西其实是要看一下百度搜索能不能返回兴业银行的官网。我们分析一下这段代码都包含些什么东西。 第一,这

    2024年02月13日
    浏览(55)
  • 如何搭建关键字驱动自动化测试框架?这绝对是全网天花板的教程

    目录 1. 驱动自动化测试介绍 2. 搭建驱动自动化测试框架 步骤1:选择测试工具 步骤2:定义测试用例 步骤3:编写测试驱动引擎 步骤4:实现测试库 步骤5:执行测试 3. 实现驱动自动化测试的关键技术 技术1:测试工具 技术2:测试驱动引擎的编写 技

    2023年04月20日
    浏览(72)
  • Python UI自动化 —— 关键字+excel表格数据驱动

    1. 对selenium进行二次封装,创建的库 2. 准备一个表格文件来写入所有测试用例步骤 3. 对表格内容进行读取,使用映射关系来对用例进行调用执行     4. 执行用例 1. 对selenium进行二次封装,创建的库 2. 创建一个表格,写入测试步骤 将表格放入项目任意路径下,记

    2024年02月09日
    浏览(46)
  • UI自动化之关键字驱动

    驱动框架:将每一条测试用例分成四个不同的部分 测试步骤(Test Step):一个测试步骤的描述或者是测试对象的一个操作说明 测试步骤中的对象(Test Object):指页面的对象或者元素 对象执行的动作(Action):页面操作的动作 执行对象所需要的数据(Test Data):任何

    2024年02月10日
    浏览(40)
  • Python Selenium UI自动化测试_python 自动化ui测试

    2.2 安装selenium pip install selenium pip install selenium==2.53.0 2.3 下载webdriver驱动 以chrome浏览器为例 查看chrome浏览器版本:在地址栏输入 chrome://version chromedriver下载地址:http://chromedriver.storage.googleapis.com/index.html 下载与浏览器版本对应的chrome driver 将下载好的chrome driver 解压,并放至到

    2024年04月14日
    浏览(75)
  • Python + Selenium自动化测试

    一、python 1、python下载与安装 官方下载地址: Python Releases for Windows | Python.org https://www.python.org/downloads/windows/ 下载应用程序,双击运行 选择install now进行安装,下方勾选第二个选项系统可自动添加环境变量   等待python安装  安装完成后,点击“Close”关闭 进入cmd验证是否已完

    2023年04月24日
    浏览(57)
  • Selenium+python怎么搭建自动化测试框架、执行自动化测试用例、生成自动化测试报告、发送测试报告邮件

    本人在网上查找了很多做自动化的教程和实例,偶然的一个机会接触到了selenium,觉得非常好用。后来就在网上查阅各种selenium的教程,但是网上的东西真的是太多了,以至于很多东西参考完后无法系统的学习和应用。 以下整理的只是书中自动化项目的知识内容,介绍怎么搭

    2024年02月05日
    浏览(66)
  • 【自动化测试】基于Selenium + Python的web自动化框架

    Selenium是一个基于浏览器的自动化工具,她提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分:Selenium IDE、Selenium WebDriver 和Selenium Grid:  1、Selenium IDE:Firefox的一个扩展,它可以进行录制回放,并可以把录制的操作以多种语言(例如java,p

    2024年02月07日
    浏览(78)
  • 【软件测试】python+selenium自动化测试

    一、什么是自动化测试 自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条件包括正常和异常,最 后评估运行结果。将人为驱动的测试行为转化为机器执行的过程。 单元测试 java的单元测试框架是Junit,在这里不再赘述。 接口自动化 接口测试就是

    2023年04月09日
    浏览(94)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包