热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python自动化脚本_Python语言web自动化通用脚本

web自动化脚本中有一部分代码是可以借鉴的,我们只需要将这个框架移植到当前项目中,修改部分参数即可。比如日志类、driver对象、元素基本操作等。以商

web自动化脚本中有一部分代码是可以借鉴的,我们只需要将这个框架移植到当前项目中,修改部分参数即可。比如日志类、driver对象、元素基本操作等。

以商城项目为例,以下就是相关代码。

base包(内含日志、driver对象、页面元素操作):

页面元素操作(base.py):

import time

from time import sleep

import page

from selenium.webdriver.support.wait import WebDriverWait

from base.get_logger import GetLogger

# 获取log日志器

log = GetLogger().get_logger()

class Base:

def __init__(self, driver):

log.info("[base]: 正在获取初始化driver对象:{}".format(driver))

self.driver = driver

# 查找元素方法 封装

def base_find(self, loc, timeout=30, poll=0.5):

log.info("[base]: 正在定位:{} 元素,默认定位超时时间为: {}".format(loc, timeout))

# 使用显示等待 查找元素

return WebDriverWait(self.driver,

timeout=timeout,

poll_frequency=poll).until(lambda x:x.find_element(*loc))

# 点击元素 方法封装

def base_click(self, loc):

log.info("[base]: 正在对:{} 元素实行点击事件".format(loc))

self.base_find(loc).click()

# 输入元素 方法封装

def base_input(self, loc, value):

# 获取元素

el = self.base_find(loc)

# 清空

log.info("[base]: 正在对:{} 元素实行清空".format(loc))

el.clear()

# 输入

el.send_keys(value)

# 获取文本信息 方法封装

def base_get_text(self, loc):

log.info("[base]: 正在获取:{} 元素文本值".format(loc))

return self.base_find(loc).text

# 截图 方法封装

def base_get_image(self):

log.info("[base]: 断言出错,调用截图")

self.driver.get_screenshot_as_file("../image/{}.png".format(time.strftime("%Y_%m_%d %H_%M_%S")))

# 判断元素是否存在 方法封装

def base_element_is_exist(self, loc):

try:

self.base_find(loc, timeout=2)

log.info("[base]: {} 元素查找成功,存在页面".format(loc))

return True # 代表元素存在

except:

log.info("[base]: {} 元素查找失败,不存在当前页面".format(loc))

return False # 代表元素不存在

# 回到首(页购物车、下订单、支付)都需要用到此方法

def base_index(self):

sleep(2)

self.driver.get(page.URL)

# 切换frame表单方法

def base_switch_frame(self, name):

self.driver.switch_to.frame(name)

# 回到默认目录方法

def base_default_content(self):

self.driver.switch_to.default_content()

# 切换窗口 方法 调用此方法

def base_switch_to_window(self, title):

log.info("正在执行切换title值为:{}窗口 ".format(title))

self.driver.switch_to.window(self.base_get_title_handle(title))

# 获取指定title页面的handle方法

def base_get_title_handle(self, title):

# 获取当前页面所有的handles

for handle in self.driver.window_handles:

log.info("正在遍历handles:{}-->{}".format(handle, self.driver.window_handles))

# 切换 handle

self.driver.switch_to.window(handle)

log.info("切换 :{} 窗口".format(handle))

# 获取当前页面title 并判断 是否等于 指定参数title

log.info("判断当前页面title:{} 是否等于指定的title:{}".format(self.driver.title, title))

if self.driver.title == title:

log.info("条件成立! 返回当前handle{}".format(handle))

# 返回 handle

return handle

driver对象(get_driver.py):

from selenium import webdriver

import page

class GetDriver:

driver = None

# 获取 driver

@classmethod

def get_driver(cls):

if cls.driver is None:

# 获取driver

cls.driver = webdriver.Firefox()

# 最大化浏览器

cls.driver.maximize_window()

# 打开url

cls.driver.get(page.URL)

# 返回 driver

return cls.driver

# 关闭driver

@classmethod

def quit_driver(cls):

if cls.driver:

cls.driver.quit()

# 必须置空操作

cls.driver = None

if __name__ == ‘__main__‘:

GetDriver().quit_driver()

日志对象(get_logger.py):

import logging.handlers

class GetLogger:

logger = None

# 在最外侧运行

# filename = "./log/xxxx.log"

# 获取 logger

@classmethod

def get_logger(cls):

# 如果 logger为空

if cls.logger is None:

# 获取日志器

cls.logger = logging.getLogger()

# 设置日志器默认级别

cls.logger.setLevel(logging.INFO)

# 获取处理器 控制台

sh = logging.StreamHandler()

# 获取处理 文件(时间)

th = logging.handlers.TimedRotatingFileHandler(filename="../log/xxxx.log",

when="midnight",

interval=1,

backupCount=30,

encoding="utf-8")

# 获取格式器

fm = "%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d] - %(message)s"

fmt = logging.Formatter(fm)

# 将格式器 设置 处理器中

sh.setFormatter(fmt)

th.setFormatter(fmt)

# 将处理器 添加到 日志器中

cls.logger.addHandler(sh)

cls.logger.addHandler(th)

# 返回 日志器

return cls.logger

定义测试套件(run_main.py直接放在项目目录下):

# 导包

import unittest

import time

from tool.HTMLTestRunner import HTMLTestRunner

# 定义测试套件 在scripts中 运行

# suite = unittest.defaultTestLoader.discover("./")

# 在最外侧运行

suite = unittest.defaultTestLoader.discover("./scripts")

# 报告生成目录及文件名称

dir_path = "./report/{}.html".format(time.strftime("%Y_%m_%d %H_%M_%S"))

# 获取文件流并调用run运行

with open(dir_path, "wb") as f:

HTMLTestRunner(stream=f, title="Tpshop商城自动化测试报告", description="操作系统:win7").run(suite)

在工具包(tools)中存放HTMLTestRunner.py文件

以上就是Python语言web自动化脚本常用的代码,按需使用。

原文地址:https://www.cnblogs.com/ray-mr-huang/p/11526426.html



推荐阅读
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有