自动化测试程序--无头浏览器,检查web网页加载是否正常,不正常/失败则自动飞书/钉钉/短信报警

一个网站可能存在N个地址,例如选中一个分类词条就是一个URL地址,那么怎么能全部遍历到,一个不漏的检查其加载是否正常呢,这里我们可以运用到查询数据库,利用正则自动拼接URL,遍历所有链接,以下分享一下代码

1:创建一个无头浏览器

2:连接数据库

3:调用飞书方法,直接复制后修改下飞书机器人地址即可,通用的(钉钉,短信也有自己的封装好的方法)

4:创建一个检查网页是否加载正常的方法(check_entries),我这里使用的是模拟用户打开浏览器,进行滑动行为,然后看页面是否存在我想要的内容,若这些内容曝光则代表正常,失败则报警(大家可以根据自身需要进行修改或者写自己需要的)

5:检查一组URL地址的可用性,并将结果通过飞书消息发送出去。具体步骤如下:

(1)定义一个字典url_sql_dict,其中键是URL前缀,值是对应的SQL查询语句。
(2)遍历字典中的每个URL前缀和SQL查询语句。
(3)如果SQL查询语句为空,则直接检查URL地址是否正常。如果正常,打印"地址正常";否则,打印"URL异常",并通过飞书消息发送报警信息。
(4)如果SQL查询语句不为空,则执行SQL查询语句,获取查询结果。
(5)遍历查询结果列表,打印字段值。
(6)判断链接是否已经包含了.html后缀。如果包含,则直接检查URL地址是否正常;否则,拼接URL链接部分路径,并添加.html后缀。
(7)如果URL地址正常,打印"地址正常";否则,打印"URL异常",并通过飞书消息发送报警信息。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
import urllib.parse
import time
import requests
import json

# 创建一个 Chrome 选项对象,用于设置无头模式
options = Options()
options.add_argument("--headless")  # 开启无头模式
options.add_argument("--disable-gpu")  # 禁用 GPU 加速

# 创建一个 webdriver 对象,传入选项参数
driver = webdriver.Chrome(options=options)  # 找到浏览器驱动位置

# 导入 pymysql 库,并创建一个数据库连接对象
import pymysql

conn = pymysql.connect(
    host='rm-uf6mp542XXXXXXXXXXo.mysql.rds.aliyuncs.com',#数据库链接
    user='root',#数据库账号
    password='XXXXXXXXXX',#数据库密码
    db='XXXXXXXXXX',#库名
    charset='utf8mb4',
    )

class FeishuTalk:

    # 飞书机器人地址
    chatGPT_url = 'https://open.feishu.cn/open-apis/bot/v2/hook/6ee0be57-847a-46a5-95e5-bbee62289b28'

    # 调用机器人发消息方法
    def sendTextmessage(self, content):
        url = self.chatGPT_url
        headers = {
            "Content-Type": "application/json; charset=utf-8",
        }
        payload_message = {
            "msg_type": "text",
            "content": {
                # @ 单个用户 <at user_id="ou_xxx">名字</at>
                "text": content + "<at user_id=\"bf888888\">XXX</at>"
                # @ 所有人 <at user_id="all">所有人</at>
                # "text": content + "<at user_id=\"all\">test</at>"
            }
        }
        response = requests.post(url=url, data=json.dumps(payload_message), headers=headers)
        return response.json


# 创建一个检查埋点曝光是否正常的方法

def check_entries(driver, url):
    try:
        driver.set_page_load_timeout(15)
        driver.get(url)
        time.sleep(2)  # 等待3秒钟防止页面未加载完毕
        driver.maximize_window()  # 放大浏览器
        time.sleep(1)
        js = "var q=document.documentElement.scrollTop=1500"  # 向下滑动1500像素
        driver.execute_script(js)  # 执行向下滑动操作
        time.sleep(2)

        flag = True
        while True:
            # 获取所有接口请求信息
            entries = driver.execute_script("return window.performance.getEntries()")

            # 判断埋点是否异常
            for entry in entries:
                entry_url = entry['name']
                # 将URL进行解码,还原特殊字符
                entry_url = urllib.parse.unquote(entry_url)

                # 获取请求URL
                if 'https://md.XXXX.com/s.gif' in entry['name'] or 'https://md.XXXX.com/c.gif' in entry[
                    'name'] or 'https://md.XXXX.com/i.gif' in entry['name']:
                    if "bhv_type=exposure" in entry_url:
                        flag = False
                        return True  # 返回True
                        break

            if flag:
                return False
                driver.quit()
    except TimeoutException:
        return False


if __name__ == '__main__':

    try:
        with conn.cursor() as cursor:
            # 定义 URL 前面的路径和 SQL 语句的字典
            url_sql_dict = {
                'https://www.XXXX.com/':"",
                'https://XXXX.com/XXXX/': "SELECT 字段 FROM 表名 条件 ",
                'https://BB./BB.com//BB/': "SELECT 字段 FROM 表名 条件 ",
  }
            # 遍历 URL 前面的路径和 SQL 语句的字典
            for url_prefix, sql in url_sql_dict.items():
                # 判断 SQL 语句是否为空
                if sql == "":
                    # 直接检查 URL 是否正常
                    url = url_prefix
                    try:
                        if check_entries(driver, url):
                            print(url,'地址正常') # 打印检查结果
                        else:
                            print("URL 异常")
                            content = 'URL 异常,请检查 ' + url # 定义报警信息
                            FeishuTalk().sendTextmessage(content) # 发送飞书报警
                    except Exception as e:
                        print("URL 检查出错:", e)
                        content = 'URL 检查出错,请检查网络连接和驱动设置'
                        FeishuTalk().sendTextmessage(content)
                else:
                    # 查询 URL 链接部分路径的字段
                    cursor.execute(sql)
                    # 获取查询结果
                    results = cursor.fetchall()
                    # 遍历查询结果列表
                    for result in results:
                        print(result[0]) # 打印字段值
                        # 判断链接是否已经包含了 .html 后缀
                        if result[0].endswith('.html'):
                            # 直接检查 URL 是否正常
                            url = url_prefix + result[0]
                        else:
                            # 拼接 URL 链接部分路径
                            url = url_prefix + result[0] + '.html'
                        # 检查 URL 是否正常
                        try:
                            if check_entries(driver, url):
                                print(url,'地址正常') # 打印检查结果
                            else:
                                print("URL 异常")
                                content = 'URL 异常,请检查 ' + url # 定义报警信息
                                FeishuTalk().sendTextmessage(content) # 发送飞书报警
                        except Exception as e:
                            print("URL 检查出错:", e)
                            content = 'URL 检查出错,请检查网络连接和驱动设置'
                            FeishuTalk().sendTextmessage(content)
    except Exception as e:
        print("查询出错:", e)
        content = '查询出错,请检查数据库连接和SQL语句'
        FeishuTalk().sendTextmessage(content)
        driver.quit()
        time.sleep(2)
    finally:
        conn.close()
        driver.quit()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值