分享Selenium测试工具用来模拟用户浏览器的操作

news2024/11/15 17:18:27

执行JS的类库:execjs,PyV8,selenium,node

pip list

c6a7a6b08a9f42f59435f2a41dfb9ab5.png

pip install selenium

2420b497f48b44d3b0af2310d399e805.png

pip install xlrd

3524f152d1a545ca8390a8541c409947.png

pip install xlwt

166d8ef184e4466ebf3635805f940570.png

pip install PyExecJS

388270bbce66455d8ec049205ad4e9f9.png

pip install xlutils

9d54006a2af8474cae64938faef17776.png

252d3a76866241c293e41ede8da8fb8b.png

selenium测试工具可以用来模拟用户浏览器的操作,其支持的浏览器有:PhantomJS,Firefox,Chrome等等,开发者可以根据当前的系统形式选择不同的模拟浏览器
每种模拟浏览器都需要对应的浏览器驱动(一个以.exe为后缀的可执行文件),使用谷歌浏览器Chrome,对应的浏览器驱动可以通过下面的网址下载。要完整地安装Python-Selenium库,让Chrome浏览器实现自动化,需要完成下面4步:Chromedriver安装、Selenium库安装、测试、关闭Chrome浏览器自动更新。

ChromeDriver - WebDriver for Chrome - Downloads

如果您使用的是Chrome 115或更新版本,请参阅Chrome测试可用性仪表板。此页面为特定的ChromeDriver版本下载提供了方便的JSON端点。

624ad2710afc4e209917ff56e0ecd689.png

a42042c6bc6c4f599d475ef2397ad324.png

# -*- coding: utf-8 -*-
"""
Created on Thu Feb 24 16:10:55 2024

@author: Administrator
"""

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import random
import time
from selenium.webdriver.chrome.options import Options

import threading
from datetime import datetime
from queue import Queue

class ShellChrome(object):
   def __init__(self,count):
       self.count = count
       self.que = Queue(maxsize = count)
       ua = self.getheaders()
       #mobile_emulation = {"deviceName": "Nexus 7"}
       self.options = webdriver.ChromeOptions()
       # 把Chrome设置成可视化无界面模式,windows/Linux 皆可
       self.options.add_argument('headless')
       # 转换手机模式
       #self.options.add_experimental_option("mobileEmulation", mobile_emulation) 
       # 全屏启动,无地址栏
       self.options.add_argument('kiosk')
       # 设置默认编码为 utf-8,也就是中文
       self.options.add_argument('lang=zh_CN.UTF-8')
       # 禁用图片加载 提升速度
       self.options.add_argument('blink-settings=imagesEnabled=false')
       # 隐身模式
       self.options.add_argument('incognito')
       # 自动打开开发者工具
       self.options.add_argument("auto-open-devtools-for-tabs")
       # 启动时,不激活(前置)窗口
       #self.options.add_argument('no-startup-window') 
       # 设置窗口启动位置(左上角坐标)
       self.options.add_argument('window-position=100,100')
       # 禁用gpu渲染 规避bug
       self.options.add_argument('disable-gpu')
       # 以最高权限运行
       self.options.add_argument('--no-sandbox')
       # 禁用JavaScript
       self.options.add_argument("--disable-javascript")
       # 设置开发者模式启动,该模式下webdriver属性为正常值
       self.options.add_experimental_option('excludeSwitches', ['enable-automation']) 
       # 禁用浏览器弹窗
       prefs = {
           'profile.default_content_setting_values' :  {
               'notifications' : 2
           }
       }
       self.options.add_experimental_option('prefs',prefs)

       # 添加ua
       self.options.add_argument('user-agent=' + ua)
       self.service = Service('D:\chromedriver.exe')
       self.options.binary_location = "C:/Program Files/Google/Chrome/Application/chrome.exe"
       # 特别注意,windows下要带.exe
       self.driver = webdriver.Chrome(options=self.options,service=self.service)
       # self.driver.maximize_window()
       # 根据桌面分辨率来定,主要是为了抓到验证码的截屏
       self.driver.set_window_size(960, 800)
       self.elements = []
  
   def threadFunc(self):
        #print("正在打开页面...")
        try:
            self.product()
            self.consume()
        except Exception as e:
             #打印异常堆栈信息
             print(e)
        #print("正在关闭页面...")
        self.driver.quit()
   def product(self):
       url = ['https://m.baidu.com/',
              'https://m.baidu.com/',
              'https://m.baidu.com/',]
       for i in range(self.count):
           # 让浏览器不要显示当前受自动化测试工具控制的提醒
           self.driver.get(url[i])
           #设置隐式等待
           self.driver.implicitly_wait(10)                 #加载等待最长10秒
           time.sleep(4)
           self.que.put(self.driver.title)
           self.elements = self.driver.find_elements(by=By.CLASS_NAME, value='detail')
           for k in range(len(self.elements)):
                self.elements[k].click()
                time.sleep(1)
       # print('先进先出队列:{0};是否为空:{1};队列大小:{2};是否满:{3}'.format(self.que.queue,self.que.empty(),self.que.qsize(),self.que.full()))
   def consume(self):
       for i in range(self.count):
           temp = self.que.get()
           #print(temp)
           #print(temp.current_url)
           #print(temp.window_handles)
           self.que.task_done()
   def getheaders(self):
        user_agent_list = ['Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1464.0 Safari/537.36',
                           'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36',
                           'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.3319.102 Safari/537.36',
                           'Mozilla/5.0 (X11; CrOS i686 3912.101.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36',
                           'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36',
                           'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36',
                           'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0.6',
                           'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1468.0 Safari/537.36',
                           'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2224.3 Safari/537.36',
                           'Mozilla/5.0 (X11; CrOS i686 3912.101.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36']
        UserAgent=random.choice(user_agent_list)
        return UserAgent
if __name__ == '__main__':
    startTime = time.perf_counter()
    print(datetime.now())
    #time.process_time()
    #time.default_timer()
    #time.perf_counter()
    count = int(input('请输入队列数:'))
    max = 10000
    i = 1
    while i < max:
        try:
            threads = []
            for _ in range(count):  # 循环创建10个线程
              lianghua = ShellChrome(count)
              t = threading.Thread(target=lianghua.threadFunc)
              threads.append(t)
              t.setDaemon(True)  # 给每个子线程添加守护线程
            for t in threads:  # 循环启动10个线程
              t.start()
            for t in threads:
              t.join(4)  # 设置子线程超时4秒
        except Exception as e:
             #打印异常堆栈信息
             print(e)
        i+=1
    endTime = time.perf_counter()
    print(int( (endTime-startTime) * 1000) / 1000)
    print(datetime.now())
    

d7f8d9f6caee44d7a0baaedb84b1b9bc.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1483246.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用lnmp环境部署laravel框架需要注意的点

1&#xff0c;上传项目文件后&#xff0c;需要chmod -R 777 storage授予文件权限&#xff0c;不然会报错file_put_contents(/): failed to open stream: Permission denied。 如果后面还是报错没有权限的话&#xff0c;就执行ps -ef |grep php查询php运行用户。然后执行chown …

简单数据类型和复杂数据类型

1. 简单数据类型 null是个特例: 2. 复杂数据类型 3. 堆和栈 注意&#xff1a; JavaScript 中是没有堆和栈的概念的&#xff0c;通过堆栈的概念可以更好的理解代码的一些执行方式&#xff0c;便于将来学习其他语言。 4. 简单数据类型传参 总结&#xff1a;简单数据类型传参传…

7款炫酷的前端动画特效分享(二)(附效果图及在线演示)

分享7款好玩的前端动画特效 其中有CSS动画、SVG动画、js小游戏等等 下方效果图可能不是特别的生动 那么你可以点击在线预览进行查看相应的动画特效 同时也是可以下载该资源的 jQuery拉开帷幕特效 基于jQuery实现的帷幕特效 点击右侧拉条 可以实现帷幕的收起也展开 非常的炫酷…

【论文笔记】Dynamic Occupancy Grids for Object Detection: A Radar-Centric Approach

原文链接&#xff1a;https://arxiv.org/abs/2402.01488 I. 引言 感知环境在自动驾驶中非常重要&#xff0c;但传统的方法将这一过程分为两方面&#xff1a;动态物体的检测和跟踪&#xff0c;以及使用占用网格表达静态环境。占用网格难以表达高度动态的物体&#xff0c;因此动…

全国青少年软件编程(Python)等级考试试卷(一级) 测试卷2021年12月

第 1 题 【 单选题 】 下面程序的运行结果是什么&#xff1f;&#xff08; &#xff09; a10 b5 ca*b print(c) A :10 B :15 C :50 D :5 正确答案:C 试题解析: 第 2 题 【 单选题 】 与a>b and b>c等价的是&#xff1f;&#xff08; &#xff09; A…

第七十二天 漏洞发现-Web框架中间件联动GobyAfrogXrayAwvsVulmap

第72天 漏洞发现-Web框架中间件&联动&Goby&Afrog&Xray&Awvs&Vulmap 知识点&#xff1a; 1、Bup简单介绍&使用说明 2、Xray简单介绍&使用说明 3、AWWS简单介绍&使用说明 4、Goby简单介绍&使用说明 5、Afrog简单介绍&使用说明 6、…

关于编写测试用例的一些思考

测试用例是QA同学的基本功&#xff0c;每个人都有一套编写测试用例的体系&#xff0c;本文是作者结合自身的工作经验以及阅读一些测试相关的书籍后的一些看法&#xff0c;欢迎大家一起讨论学习。 测试设计 测试用例格式 面试中一些常见的问题 1.APP测试与服务端测试的区别&am…

【黑马程序员】5、TypeScript类型声明文件_黑马程序员前端TypeScript教程,TypeScript零基础入门到实战全套教程

课程地址&#xff1a;【黑马程序员前端TypeScript教程&#xff0c;TypeScript零基础入门到实战全套教程】 https://www.bilibili.com/video/BV14Z4y1u7pi/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 5、TypeScript类型声明文件 5.1 TS中的…

Ai-WB2-32S在window下使用vs 和 msys2编译以及烧录

文章目录 前言一、使用前准备第一步 安装vscode第二步 安装msys2 二、使用步骤1.打开MSYS2 MINGW64&#xff08;1&#xff09;在开始栏中找到MSYS2 MINGW64并打开&#xff08;2&#xff09;安装git&#xff08;3&#xff09;安装make&#xff08;4&#xff09;安装好之后的文件…

职场的过早优化

过早优化&#xff0c;指的是还没弄清楚需求未来的变化的走向的时候&#xff0c;忽略了更重要的问题。 放在职业发展上&#xff1a;你在没有积累足够职场资源&#xff08;眼界、能力、人脉等等&#xff09;&#xff0c;也没有对职业发展形成清晰认知的时候&#xff0c;就过早地进…

c++基础知识补充4

单独使用词汇 using std::cout; 隐式类型转换型初始化&#xff1a;如A a1,,此时可以形象地理解为int i1;double ji;&#xff0c;此时1可以认为创建了一个值为1的临时对象&#xff0c;然后对目标对象进行赋值&#xff0c;当对象为多参数时&#xff0c;使用&#xff08;1&#xf…

如何解决幻兽帕鲁/Palworld服务器联机游戏时的丢包问题?

如何解决幻兽帕鲁/Palworld服务器联机游戏时的丢包问题&#xff1f; 等待服务器维护&#xff1a;首先&#xff0c;确保网络连接稳定&#xff0c;然后查看游戏官方或社区论坛&#xff0c;了解是否有服务器维护的消息。这是解决丢包问题的一种直接且有效的方法。 更新显卡驱动&a…

Springboot接口参数校验

在设计接口时我们通常需要对接口中的非法参数做校验&#xff0c;以降低在程序运行时因为一些非法参数而导致程序发生异常的风险&#xff0c;例如登录的时候需要校验用户名密码是否为空&#xff0c;创建用户的时候需要校验邮件、手机号码格式是否准确。如果在代码中对接口参数一…

React之组件定义和事件处理

一、组件的分类 在react中&#xff0c;组件分为函数组件和class组件&#xff0c;也就是无状态组件和有状态组件。 * 更过时候我们应该区别使用无状态组件&#xff0c;因为如果有状态组件会触发生命周期所对应的一些函数 * 一旦触发他生命周期的函数&#xff0c;它就会影响当前项…

Linux学习笔记:进程的终止和等待

进程终止和等待 进程终止进程退出场景进程常见退出方式_exit()退出exit()退出return退出exit()与_exit()的不同之处 进程的等待什么是进程等待?为什么要进行进程等待如何进行等待wait方式:waitpid方式 进程终止 进程退出场景 一般来讲,进程的退出场景有三种: 代码运行完毕,…

chalk库的使用

这篇文章主要是对chalk库官方文档的中文翻译以及我自己的一些理解。chalk的官方文档可以看这里。 首先说下chalk库的作用&#xff1a;美化终端输出的文本&#xff0c;例如添加不同的字体颜色、不同颜色的背景、粗体以及添加下划线等等&#xff0c;看下图&#xff1a; 优点 富…

Vue2->3

Vue2->3 认识Vue31. Vue2 选项式 API vs Vue3 组合式API2. Vue3的优势 使用create-vue搭建Vue3项目1. 认识create-vue2. 使用create-vue创建项目 熟悉项目和关键文件组合式API - setup选项1. setup选项的写法和执行时机2. setup中写代码的特点3. <script setup>语法糖…

基于springboot+vue的社区养老服务平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Kali Linux 安装 + 获取 root 权限 + 远程访问

一、什么是Kali kali是linux其中一个发行版&#xff0c;基于Debian&#xff0c;前身是BackTrack&#xff08;简称BT系统&#xff09;。kali系统内置大量渗透测试软件&#xff0c;可以说是巨大的渗透系统&#xff0c;涵盖了多个领域&#xff0c;如无线网络、数字取证、服务器、密…

【MySQL】表的内连和外连(重点)

表的连接分为内连和外连。 一、内连接 内连接实际上就是利用 where 子句对两种表形成的笛卡儿积进行筛选&#xff0c;前面学习的查询都是内连接&#xff0c;也是在开发过程中使用的最多的连接查询。 select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件; 注意&…