python自动化测试(四):ECShop后台:商品分类添加

前置条件:

本地部署:ECShop的版本是3.0.0、Google版本是

Google Chrome65.0.3325.162 (正式版本) (32 位) 

Google驱动的selenium版本是3.11.0

目录

前置代码

一、登录(后台登录)

二、进入商品分类页面

三、子页面

四、返回父级/最外层页面

五、点击添加分类按钮

六、输入分类

6.1 输入分类名称

6.2 上级分类 -- 下拉菜单的实现

6.3 输入 数量单位

6.4 输入排序

6.5 单选框

6.6 多选框

6.7 点击确定按钮

6.8 A下拉框对应不同的B下拉框

七、结束进程


前置代码
# coding=utf-8
from selenium import webdriver
from selenium.webdriver.support.select import Select
import time
driver = webdriver.Chrome()
url = "http://localhost/ecshop/admin/privilege.php?act=login"
driver.get(url)
# 最大化浏览器窗口
driver.maximize_window()
# 添加全局的等待时间
driver.implicitly_wait(10)

这里我是部署了一个本地的ECSHOP项目,所以该篇就以我的项目为准设置了

一、登录(后台登录)
# 一、登录
# 输入用户名
driver.find_element_by_name("username").send_keys("admin")
# 输入密码
driver.find_element_by_name("password").send_keys("t1194783")
driver.find_element_by_class_name("btn-a").click()

运行,登录成功,然后进入到后台页面

二、进入商品分类页面
# 点击商品分类
driver.find_element_by_link_text("商品分类").click()

然后这里跑代码,是出问题了,找不到元素

那么有可能是页面中包含了子页面的问题

三、子页面

去检查一下上图的列表,发现他是被一个标签<frame>包裹的

而这个标签,相当于独立页面的意思

在HTML中,<frame>标签用于定义一个框架(也称为窗口或浏览器窗口的一部分)。

这使得可以在浏览器中显示多个不同的网页,使它们在同一个窗口内分开。

那么,就先进入到子页面,也就是id为menu-frame的frame标签中

进入子页面的方法

driver.switch_to.frame(“main-frame”)

进入子页面
通过id或者name时可以直接将id或者name放到frame()函数的括号中直接切换子页面
driver.switch_to.frame(“main-frame”)
如果是通过其他六种方式定位子页面,我们需要将完整的定位语句放在括号中,才能正确切换子页面
#进入子页面
ele=driver.find_element_by_xpath("//frame[@id='main-frame']")
driver.switch_to.frame(ele)

driver.switch_to.frame() #旧方法
driver.switch_to_frame() #新方法
# 二、商品分类页面
# 1、进入子页面
driver.switch_to.frame("menu-frame")
# 2、点击商品分类
driver.find_element_by_link_text("商品分类").click()

这样子就可以成功跳转了

四、返回父级/最外层页面

现在所处的页面范围是在左侧列表的frame标签里面,所以我们得往上退回去

那么,返回父级页面的语法是:driver.switch_to.parent_frame()

但是这里不返回父级,我们返回到最外层

返回最外层页面
driver.switch_to.default_content()

# 三、返回最外层
driver.switch_to.default_content()

五、点击添加分类按钮

点击该按钮,右侧的页面同样被frame标签分割了,所以也需要访问到子页面,这里可以用xpath的方式去访问这个子页面

# 四、点击添加分类
# 进入子页面
ele = driver.find_element_by_xpath("//frame[@id='main-frame']")
driver.switch_to_frame(ele)
time.sleep(2)
# 点击添加分类
driver.find_element_by_xpath("//html/body/h1/span[1]/a").click()

六、输入分类
6.1 输入分类名称

# 输入分类名称
driver.find_element_by_name("cat_name").send_keys("服装")

6.2 上级分类 -- 下拉菜单的实现

1、先获取到select的下拉菜单元素

2、创建一个Select('元素') 对象

在获取到的Select对象中,有三个方法可以进行操作

s.select_by_index(index) # 根据索引从0开始选择一个选项
s.select_by_value(value) # 根据其值开始选择一个选项
s.select_by_visible_text("text") # 根据选项的文本,选择一个选项

这里先创建个对象

# 选择上级分类
ele = driver.find_element_by_name("parent_id")
s = Select(ele)

select_by_index(index)方法:

s.select_by_index(1)

(这里也根据索引,选择了第二个选项)

select_by_value(val)方法:

如果是用这个方法,可以看一下select列表里面option元素对应的value属性值

选择value值为27的选项

s.select_by_value("27")

select_by_visible_text("文本")方法:

s.select_by_visible_text("顶级分类")

6.3 输入 数量单位
#输入数量单位
driver.find_element_by_name("measure_unit").send_keys("1000")

6.4 输入排序

此处的排序和数量单位虽然都是输入,但是排序是有默认值的,这个时候,先获取排序的元素,通过方法:clear() 清空数据,再进行输入

#输入排序
driver.find_element_by_name("sort_order").clear()
driver.find_element_by_name("sort_order").send_keys("10")

6.5 单选框

单选框的话可以通过xpath去定位,用序号的方法

#选择是否显示(是)
driver.find_element_by_xpath("(//input[@name='is_show'])[1]").click()
#选择是否显示在导航栏
driver.find_element_by_xpath("(//input[@name='show_in_nav'])[2]").click()

去审查一下元素

单选框的input标签的name属性值是一致的,那点击顺序按序号获取就好了

6.6 多选框

这里要点击几个,就按序号点击几次,写几行点击事件就好了

#选择设置首页推荐(精品)
driver.find_element_by_xpath("(//input[@name='cat_recommend[]'])[1]").click()
#选择设置首页推荐(最新)
driver.find_element_by_xpath("(//input[@name='cat_recommend[]'])[2]").click()

(点击第一个和第二个)

6.7 点击确定按钮
#点击确定按钮
driver.find_element_by_xpath("//input[@type='submit']").click()

6.8 A下拉框对应不同的B下拉框

# 1、先获取到A下拉框,然后
ele_a = driver.find_element_by_xpath(
    "//*[@id=\"tbody-attr\"]/tbody/tr/td/select[1]")
a = Select(ele_a)
a.select_by_visible_text("精品手机")

# 2、获取B的下拉
ele_b = driver.find_element_by_xpath(
    "//*[@id=\"tbody-attr\"]/tbody/tr/td/select[2]")
b = Select(ele_b)
b.select_by_visible_text("上市日期")

七、结束进程
time.sleep(5)
driver.quit()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript笔记(本文中将JavaScript简写为JS)

JS对大小写敏感 JS代码块的作用域都是全局的 JS的数组只能使用数字作为下标 JS对浮点型数据的精确度很难确定 JS在定义数组元素以及对象&#xff0c;在最后不能添加逗号 JS 中&#xff0c;变量可以在使用后声明&#xff0c;也就是变量可以先使用再声明&#xff0c;但不适用于已…

wkhtmltoimage/wkhtmltopdf 使用实践

1. 介绍 wkhtmltopdf/wkhtmltoimage 用于将简单的html页面转换为pdf或图片&#xff1b; 2.安装 downloads 2.1. mac os 下载64-bit 版本然后按照指示安装, 遇到 untrust developers 时&#xff0c;需要在 Settings -> Privacy 处信任下该安装包。 2.2. debian # 可用…

vscode代码快捷输入

Vscode代码片段快捷输入 常用的代码片段为了避免重复输入,可以使用Vsco的中用户代码片段进行设置,这样就可以实现快捷输入. 操作流程 如下 打开vscode的设置 2. 找到用户代码片段 3. 选择模板 4. 然后写入代码片段即可 上面的代码片段可以设置多个,看自己 重点关注的是 prefi…

05 MIT线性代数-转置,置换,向量空间Transposes, permutations, spaces

1. Permutations P: execute row exchanges becomes PA LU for any invertible A Permutations P identity matrix with reordered rows mn (n-1) ... (3) (2) (1) counts recordings, counts all nxn permuations 对于nxn矩阵存在着n!个置换矩阵 , 2. Transpose: 2.…

p5.js 3D图形-立方体

本文简介 带尬猴&#xff0c;我嗨德育处主任 前面写了几篇 p5.js 文章 都还没涉及到3D图形&#xff0c;但其实 p5.js 是提供了基础的3D图形的。 本文就从最简单的立方体讲起&#xff0c;并做几个小demo和各位工友一起掌握立方体的用法。 立方体的基础用法 在 p5.js 里使用 b…

Ubuntu 内核降级到指定版本

reference https://www.cnblogs.com/leebri/p/16786685.html 前往此网站&#xff0c;找到所需的内核 https://kernel.ubuntu.com/~kernel-ppa/mainline/ 查看系统架构 dpkg --print-architecture 二、下载安装包 注意&#xff1a;下载除lowlatency以外的deb包 三、安装内核 3…

基于图像识别的跌倒检测算法 计算机竞赛

前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于图像识别的跌倒检测算法 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/…

FreeRTOS 事件标志组 详解

目录 什么是事件标志组&#xff1f; 事件标志位 事件标志组 事件标志组相关 API 函数 1. 创建事件标志组 2. 设置事件标志位 3. 清除事件标志位 4. 等待事件标志位 事件标志组实操 什么是事件标志组&#xff1f; 事件标志位 表明某个事件是否发生&#xff0c;联想&am…

优咔科技创新连接方案助力高质量5G车联服务

上海优咔网络科技有限公司 CEO 闫楠 【摘要】本文就智能网联汽车对高质量5G车联服务的需求背景和行业趋势进行了分析&#xff0c;主要介绍采用5G双SIM卡的创新连接方案&#xff0c;重点讲述双SIM卡联网的端到端体系架构和技术方案&#xff0c;并就优咔科技全方位支撑行业领先车…

设计模式—创建型模式之单例模式

设计模式—创建型模式之单例模式 介绍 单例模式说明&#xff1a;一个单一的类&#xff0c;负责创建自己的对象&#xff0c;同时确保系统中只有单个对象被创建。 单例模式特点&#xff1a; 某个类只能有一个实例&#xff1b;&#xff08;构造器私有&#xff09;它必须自行创…

【抓包分析】通过ChatGPT解密还原某软件登录算法实现绕过手机验证码登录

文章目录 &#x1f34b;前言实现效果成品广告抓包分析一、定位加密文件二、编辑JS启用本地替换 利用Chatgpt进行代码转换获取计划任务id模拟数据请求最后 &#x1f34b;前言 由于C站版权太多&#xff0c;所有的爬虫相关均为记录&#xff0c;不做深入&#xff01; 今天发现gith…

读图数据库实战笔记01_初识图

1. 图论 1.1. 起源于莱昂哈德欧拉在1736年发表的一篇关于“哥尼斯堡七桥问题”的论文 1.2. 要解决这个问题&#xff0c;该图需要零个或两个具有奇数连接的节点 1.3. 任何满足这一条件的图都被称为欧拉图 1.4. 如果路径只访问每条边一次&#xff0c;则该图具有欧拉路径 1.5…

【华为路由器】配置企业通过5G链路接入Internet示例

场景介绍 5G Cellular接口是路由器用来实现5G技术的物理接口&#xff0c;它为用户提供了企业级的无线广域网接入服务&#xff0c;主要用于eMBB场景。与LTE相比&#xff0c;5G系统可以为企业用户提供更大带宽的无线广域接入服务。 路由器的5G功能&#xff0c;可以实现企业分支…

贪心算法学习——单调递增的数字

一&#xff0c;单调递增的数字 1.题目 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 示例 1: 输入: n 10 输出: 9示例 2: 输入…

智能问答技术在百度搜索中的应用

作者 | Xiaodong 导读 本文主要介绍了智能问答技术在百度搜索中的应用。包括机器问答的发展历程、生成式问答、百度搜索智能问答应用。欢迎大家加入百度搜索团队&#xff0c;共同探索智能问答技术的发展方向&#xff0c;文末有简历投递方式。 全文6474字&#xff0c;预计阅读时…

8.稳定性专题

1. anr https://code84.com/303466.html 一句话&#xff0c;规定的时间没有干完要干的事&#xff0c;就会发生anrsystem_anr场景 input 5sservice 前台20s 后台60scontentprivider超市 比较少见 原因 主线程耗时 复杂layout iobinder对端block子线程同步锁blockbinder被占满导…

vr虚拟现实技术融入司法办案实操培训中的优势

模拟法院诉讼一直室各大法学院法律实践性教学的重要方式和内容&#xff0c;通过让学员在模拟环境中实操一遍诉讼流程及相关资料&#xff0c;达到上岗就业的教学目标。 学生可以选择法官席、律师席、证人席等不同角色进行体验&#xff0c;在VR模拟法庭中进行案件审判和辩论&…

Linux - firewall-cmd 命令添加端口规则不生效排查

文章目录 linux 防火墙 firewall-cmd 命令详解问题排查 linux 防火墙 firewall-cmd 命令详解 基本语法 firewall-cmd --zonezone-name --add-serviceservice-name --permanent命令参数 --zone&#xff1a;指定要添加服务的区域名称。 --add-service&#xff1a;指定要添加的…

Android环境变量macOS环境变量配置

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览macOS基础知识 三、设置环境变量3.1 终…

【C++系列】STL容器——vector类的例题应用(12)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01;本章主要内容面向接触过C的老铁&#xff0c;下面是收纳的一些例题与解析~ 主要内容含&#xff1a; 目录 【例1] 只出现一次的数字i&#xff08;范围for与模等&#xff08;^&#xff09;)【例2]…