舍友打一把游戏的时间,我实现了一个selenium自动化测试并把数据保存到MySQL

article/2025/10/1 18:03:48

文章目录

    • 前言
    • 最终效果
    • 开发环境
    • selenium元素定位方法
    • 页面分析
    • 思路分析
    • 实现步骤
    • 运行结果
    • 以下是全部代码


前言

很久没有玩selenium自动化测试了,近日在学习中都是在忙于学习新的知识点,所以呢今天就来写个selenium自动化测试的案例吧。有没有人疑惑?What is selenium,那我来告诉你吧!起码能让你了解到它是干什么的,Selenium 是一种开源工具,用于在 Web 浏览器上执行自动化测试(使用任何 Web 浏览器进行 Web 应用程序测试)。

反正就是我们躺着,让它自己动,躺好,让 selenium 满足你的要求。
在这里插入图片描述
那么接下来进入正题吧!





最终效果

先一览最终效果吧,数据都保存到Exel,及MySQL数据库中。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

开发环境

需要配置好selenium运行环境,及安装好相关的库,这些都可在博客上查找相关教程。
python3.8
selenium模块
pymysql






selenium元素定位方法

下图就是selenium提供的利用元素定位可以找到加载页面中的任何对象,类似于我们查看加载的页面,并找到我们的目标信息,以便执行其它相关操作。
在这里插入图片描述
知道多种元素定位能更好的帮我们找到所需要的信息。
在这里插入图片描述



页面分析

先是打开页面右键点击检查,或者按下F12点Elements查看网页源代码,
观察页面源码查看我们的输入框是在页面源代码里面的什么位置,(从源码中可以看出输入框的标签在body中,而前后都没有iframe),
因为如果不看的话有些网址有个子页面iframe,而页面的有些元素标签就存在子页面iframe中,
这样我们直接查找标签是找不到标签的,也就进行不了操作,需要切换到子页面iframe中才能获取到标签。这样能确保我们操作的时候不用再查找bug。

在这里插入图片描述
想一下如果要实现自动化的话是不是要浏览器自己打开网页然后我们通过selenium提供的元素定位方法找到输入框输入我们想要查找的商品,并点击搜索去搜索这个商品,然后搜索到了就把网页显示出来的商品信息通过selenium定位,进行其他相关操作。

那么接下来看一下思路吧!
在这里插入图片描述



思路分析

操作浏览器打开浏览器对象,找到输入框和点击按妞,并输入信息后点击,商品展视出来后,设置个selenium动作链运动页面到网页底部,这样是为了加载商品出来,然后用selenium标签定位的方法找到全部商品的div,设置循环每个商品div点击进入商品的详情页selenium定位我们需要的信息并提取出来。在这里插入图片描述




实现步骤

1.MySQL创建数据库(后面储存数据时候需要)

create database shop charset=utf8;

在这里插入图片描述

2.导入相对应的库对网页发起请求,找到输入框(这里我输入框输入的商品是电脑)和点击按键,

    # 输入框insert = driver.find_element(By.XPATH,'//*[@id="J-search"]/div[1]/input')insert.send_keys('电脑')time.sleep(1)

3.搜索商品出来后,设置动作链加载商品,selenium找到全部div循环点击进入商品详情页获取信息。
在这里插入图片描述

页面商品的全部div在标签section下面,但要注意的是第一个div不是商品的di,我框起来的那些才是。

在这里插入图片描述
因此要做个切片除了第一个div我不要,后面的全部都要。
在这里插入图片描述

全部商品的div有了接下来就是进入到详情页拿信息了,这些信息都存储在页面源码中。
在这里插入图片描述
selenium提供的定位方法提取需要信息。
在这里插入图片描述
在这里插入图片描述

信息有了之后就构造一个字典把数据存入,再把字典添加到列表中。
在这里插入图片描述

4.翻页的实现。
滑到页面底部查看下一页的标签。

在这里插入图片描述
selenium定位到元素标签,并点击下一页

最后return返回的是存储字典的列表。
在这里插入图片描述

基本的步骤都完成了接下来就是对数据的保存了

下图函数是实现对数据的保存到Exel
在这里插入图片描述

下图是连接数据库和创建游标对象,并编写好建表的sql语句后面交给游标执行,注意要把自己MySQL登录的密码改成自己的,数据库一开始我就在开头创建好了,这里直接用database选择我们创建好的数据库就OK,
在这里插入图片描述

因为我们的数据在列表中,因此对列表遍历得到字典,再用键的方式取字典里面的值。
编写插入数据库的sql语句,交给游标去执行。

在这里插入图片描述

步骤就完成了



运行结果

在这里插入图片描述

到这里程序就完成了,运行代码时注意保持网络畅通,如果网速太慢可能会失败,建议在网络好的环境下运行。
在这里插入图片描述

以下是全部代码

# @Author : 王同学
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait   # 等待
from selenium.webdriver.common.action_chains import ActionChains    # 动作链
from selenium.webdriver.support import expected_conditions as EC
import time
import csv  # csv
import pymysql  # MySQL库# 创建浏览器对象
driver = webdriver.Chrome()# 显示等待
wait = WebDriverWait(driver,10)def get_serch(url):# 窗口最大化driver.maximize_window()# 发送请求driver.get(url,)print('===========访问成功============')time.sleep(1)# 等待页面元素加载wait.until(EC.presence_of_element_located((By.XPATH,'//*[@id="J-search"]/div[1]/input')))# 输入框insert = driver.find_element(By.XPATH,'//*[@id="J-search"]/div[1]/input')insert.send_keys('电脑')time.sleep(1)# clickcli = driver.find_element(By.CLASS_NAME,'c-search-icon')cli.click()time.sleep(1)def get_data():# 空列表all_data = []num = 1while num <= 12:print(f'========================正在保存第{num}页的数据======================')# 加载三次for i in range(1,4):try:# 动作链加载元素action = driver.find_element(By.XPATH,'//*[@id="J_nextPage_link"]/i')ActionChains(driver).move_to_element(action).perform()time.sleep(1)except:print('======================没有下一页了===================')break# 找到全部divall_div = driver.find_elements(By.XPATH,'//*[@id="J_searchCatList"]/div')print(f'=============一共有{len(all_div)}件商品=============')time.sleep(1)# 字典for i in all_div[1:]:   # 切片,除了第一个不要i.click()time.sleep(1)# 切换窗口视角driver.switch_to.window(driver.window_handles[-1])try:title = driver.find_element(By.XPATH,'//*[@id="J_detail_info_mation"]/div/p[1]').textexcept:title = 'NOD DATA'try:money = driver.find_element(By.XPATH,'//*[@class="spcecialPrice-box"]/div[1]/div[1]/span[1]').textexcept:money = 'NOD DATA'try:clear = driver.find_element(By.XPATH,'//*[@class="color-list"]/ul').text.replace('\n','').replace(' ','|').replace('♥','')except:clear = 'NOD DATA'try:details = driver.find_element(By.XPATH,'//*[@id="J_dc_Detail"]/div[2]/div[1]/table/tbody').text.replace('\n','').replace(' ','|')except:details = 'NOD DATA'try:brand = driver.find_element(By.XPATH,'//*[@class="pib-title"]/a').textexcept:brand = 'NOD DATA'try:cheap = driver.find_element(By.XPATH,'//*[@class="finalPrice"]/div[1]/span').text.replace('¥','').replace('起','')except:cheap = 'NOD DATA'item = {'标题': title,'价格': money,'配色': clear,'信息': details,'品牌': brand,'特价': cheap}print(item)all_data.append(item)driver.close()# 切换回用来的driver.switch_to.window(driver.window_handles[0])time.sleep(1)try:# 翻页net_page = driver.find_element(By.XPATH, '//*[@id="J_nextPage_link"]/i')net_page.click()num += 1except:breaktime.sleep(1)# 验证try:driver.switch_to.frame(driver.find_element(By.TAG_NAME, 'iframe'))dic = driver.find_element(By.XPATH, '/html/body/div/a')dic.click()time.sleep(1)driver.switch_to.default_content()except:continuereturn all_datadef save_csv(all_data):# 表头headers = ['标题','价格','配色','信息','品牌','特价']# 打开文件with open('数据.csv','w',encoding='utf-8',newline='')as f:filt = csv.DictWriter(f,headers)filt.writeheader()filt.writerows(all_data)return all_datadef sql_mysql(all_data):# 创建MySQL,用自己MySQL登录密码mysql = pymysql.connect(host='localhost',user='root',password='111111',port=3306,charset='utf8',database='shop')# 游标db = mysql.cursor()# 创建数据库database = 'create database if not exists shop charset=utf8'# 创建表sql = 'create table if not exists data(' \'id int not null primary key auto_increment' \',title varchar(1000)' \',money varchar(1000) not null' \',clear varchar(1000) not null' \',details varchar(1000) not null' \',brand varchar(1000) not null' \',cheap varchar(2000) not null' \');'for it in all_data:title = it['标题']money = it['价格']clear = it['配色']details = it['信息']brand = it['品牌']cheap = it['特价']insert = 'insert into data(title,money,clear,details,brand,cheap) value (%s,%s,%s,%s,%s,%s);'data = [title,money,clear,details,brand,cheap]try:# 执行创建库db.execute(database)# 执行建表db.execute(sql)# 插入数据db.execute(insert,data)# 提交事务mysql.commit()except Exception as e:print('========插入数据失败========',e)mysql.rollback()# 游标关闭db.close()# mysql关闭mysql.close()def main():url = 'https://www.vip.com/'get_serch(url)all_data = get_data()all_data = save_csv(all_data)sql_mysql(all_data)if __name__ == '__main__':main()

http://chatgpt.dhexx.cn/article/swt2O9VL.shtml

相关文章

51nod P1381 硬币游戏【数学】

题目 思路 比较简单. 参考代码 #include<iostream> #include<cstdio> using namespace std; int T,n; int main() {scanf("%d",&T);while(T--){scanf("%d",&n);printf("%d\n",2*n);}return 0; }

51nod3061 车

题目 题目链接 解题思路 提一种不需要生成树的解法。 我们将询问挂到点上&#xff0c;使用启发式合并的并查集。当询问的两边合并到一起时&#xff0c;我们就得到了答案。 整体复杂度 O ( n l o g 2 n ) O(nlog_2n) O(nlog2​n)。 代码 #include <cstdio> #include &…

51nod 1279 扔盘子

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1279 题目: 有一口井,井的高度为N,每隔1个单位它的宽度有变化。现在从井口往下面扔圆盘,如果圆盘的宽度大于井在某个高度的宽度,则圆盘被卡住(恰好等于的话会下去)。 盘子有几种命运:1、掉到…

51nod 1352:集合计数

1352 集合计数 基准时间限制&#xff1a;1 秒 空间限制&#xff1a;131072 KB 分值: 20 难度&#xff1a;3级算法题 收藏 关注 给出N个固定集合{1&#xff0c;N},{2,N-1},{3,N-2},...,{N-1,2},{N,1}.求出有多少个集合满足&#xff1a;第一个元素是A的倍数且第二个元素是B的倍数…

51nod 1266 蚂蚁

题目链接&#xff1a;https://www.51nod.com/onlineJudge/questionCode.html#!problemId1266 题目&#xff1a; n只蚂蚁以每秒1cm的速度在长为Lcm的竿子上爬行。当蚂蚁爬到竿子的端点时就会掉落。由于竿子太细&#xff0c;两只蚂蚁相遇时&#xff0c;它们不能交错通过&#xff…

51nod3155 跳房子

3155 跳房子 小华正在和她的小伙伴玩跳房子游戏。这是一个加强版的跳房子&#xff0c;每一行的格子数量可能超过 2 个。 这个游戏需要在地面上画了n排格子&#xff0c;其中第i排包含a[i]个格子。&#xff08;保证两端的这两排仅有一个格子&#xff09; 之后规定两端的这两个格…

Pycharm中用Appium框架编写第一个自动化脚本

一.环境依赖 Node.js appium python jdk Android SDK Appium-Python-Client Appium-doctor 二.环境搭建 提醒&#xff1a;安装路径如果要自定义的话尽量不要出现中文&#xff0c;不然很容易出现各种报错&#xff01; cmd尽量用管理员身份运行 1.Node.js 下载地址&am…

软件行为(五)之数据存储

笔者愚见&#xff1a;数据的存储方式是软件行为中的重中之重。 存储数据大约有4个地方&#xff1a;寄存器、高速缓存、内存及硬盘等。其中cpu对数据的访问速度也是依次降低&#xff0c;如下图 上图从上到下也是cpu访问数据的顺序&#xff0c;CPU的数据去寄存区去拿&#xff0c…

探究业界云存储平台(1):开源的软件定义存储—CoprHD

在接下来的两章中&#xff0c;我将分别为大家介绍与分析三款软件定义存储解决方案&#xff1a;CoprHD、Ceph与ScaleIO&#xff0c;并对后两者进行性能比较分析。 一、开源的软件定义存储—CoprHD 了解开源的CoprHD&#xff08;CoprHD&#xff09;&#xff0c;需要先了解EMC V…

软件定义存储2.0,谁领风骚?

关注我们牛年牛气冲天 中国的软件定义存储&#xff08;SDS&#xff09;市场就像是早上八九点钟的太阳&#xff0c;那样耀眼&#xff0c;生机勃勃&#xff0c;富有朝气。IDC的报告显示&#xff0c;2020年全年&#xff0c;中国SDS市场规模同比增长51.7%&#xff0c;相比2019年&am…

软件定义存储

在一个生成的数据和数据种类都空前大量的时代&#xff0c;软件定义的存储赋予了企业有效应对此爆炸式增长的途径。 当然&#xff0c;随着营销机器在过去几年的大肆渲染&#xff0c;我们越来越难以了解软件定义的存储的确切含义。因此&#xff0c;为了更好地了解软件定义的存储可…

软件定义存储的逆袭

近日&#xff0c;IDC《2017年第二季度中国软件定义存储及超融合市场跟踪报告》的发布在国内软件定义存储&#xff08;SDS&#xff09;和超融合&#xff08;HCI&#xff09;市场激起涟漪。去年还隐身于“Others”的一众厂商中&#xff0c;今年却一跃成为SDS市场前三&#xff0c;…

SDS软件定义存储

计算机发展到今天&#xff0c;软件定义已经是一种潮流&#xff0c;前有软件定义网络&#xff0c;后有软件定义存储。 对于软件定义存储来说&#xff0c;是随着当年EMC在EMC World上发布的软件定义存储战略迅速成为业界热点的。软件定义存储将硬件存储资源整合起来&#xff0c;…

基于对象的软件定义存储——联想 NetApp DXL系列对象存储方案

联想 DXL 系列对象存储 基于NetApp StorageGRID 技术的联想DXL系列对象存储是一款基于对象的软件定义的存储&#xff0c;它支持 Amazon Simple Storage Service (S3) API 等行业标准对象 API。您可以利用它在全球范围内的 16 个数据中心之间构建一个单一名称空间&#xff0c;并…

软件定义的存储时代即将结束

数据存储、安全性、保护和整体管理对于大多数组织的生存至关重要。 从软件定义的存储时代的结束到本地存储的回归&#xff0c;Nyriad的首席营收官概述了他对最新技术趋势的看法&#xff0c;并提供了他对2023年将会发生的预测。 从以CPU为中心的软件定义存储过渡到卸载辅助架构…

【存储】软件定义存储,看这一篇就够了!

原文&#xff1a;https://www.sohu.com/a/397070625_505795 1.SDS科普 SDS(Software Defined Storage)即软件定义存储&#xff0c;简单地说就是将存储硬件和软件进行分离&#xff0c;采用标准化硬件作为载体(如X86架构)&#xff0c;基于软件实现企业级存储功能和服务。相对于传…

软件定义存储的特征及如何工作

软件定义存储的特征 1 可扩展性 软件定义存储可从传统三节点扩展为数千节点&#xff0c;随着存储设备数量的逐渐递增&#xff0c;软件定义存储内部吞吐量也会不断增加&#xff0c;各项存储性能呈现出线性扩展性能&#xff0c;确保信息可允许群集中的应用控制及访问。 2 弹性…

软件定义存储的定义与分类

2011年8月21日&#xff0c;Netscape创始人马克安德森&#xff08;Marc Andreessen, 硅谷著名投资人, 投资了Facebook、Groupon、Skype、Twitter、Zynga和LinkedIn等高科技新秀&#xff09;&#xff0c;在华尔街日报上发表《软件正在吞噬整个世界》&#xff0c;认为当今的软件应…

【存储】SDS软件定义存储,看这一篇就够了

目录 一、简略说明 二、详细说明 作者&#xff1a;bandaoyuUESTC ,连接&#xff1a;https://blog.csdn.net/bandaoyu/article/details/110245309&#xff0c;不断编辑中 一、简略说明 0.通俗讲是SDS 即存储软件和硬件不绑定&#xff0c;软件不是作为存储设备中的固件&#…

软件定义存储概览(一篇就够)

以下文章来源于TaoCloud &#xff0c;作者刘爱贵 刘爱贵的博客_CSDN博客-数据存储,GNU/LINUX,程序人生领域博主 1.SDS科普 SDS&#xff08;Software Defined Storage&#xff09;即软件定义存储&#xff0c;简单地说就是将存储硬件和软件进行分离&#xff0c;采用标准化硬件…