selenium自动化测试-登录网站用户

昨天学习了selenium自动化测试工具的入门,知道了Selenium是用于自动化控制浏览器做各种操作,打开网页,点击按钮,输入表单等等。

今天学习通过selenium自动化测试工具自动登录某网站用户操作。

第一步:确定目标网址

比如:天天基金网站登录页面"https://login.1234567.com.cn/login"

第二步:确定登录表单元素位置

通过谷歌浏览器F12调试功能可以很快的定位页面元素位置,这也是开发常用谷歌浏览器的原因吧!

比如:用户账号输入框位置

通过 F12 调试确定元素位置,然后右键--》Copy--》Copy XPath: 获得账号输入框位置: //*[@id="tbname"]

在后面写代码操作该元素使用该方法即可:  driver.find_element(By.ID, "tbname")

依次类推,获取密码,记住交易账号单选框,已阅读单选框,登录按钮等等表单元素位置。

第三步:编写代码

采用拆分步骤细化功能模块封装方法编写代码,便于后续扩展功能模块。

ttjj_webdriver.py:

# -*- coding: UTF-8 -*-
# selenium 自动化测试工具
import time
import random
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By# 打开驱动
def open_driver():try:# 连接浏览器web驱动全局变量global driver# Linux系统下浏览器驱动无界面显示,需要设置参数# “–no-sandbox”参数是让Chrome在root权限下跑# “–headless”参数是不用打开图形界面'''chrome_options = Options()# 设为无头模式chrome_options.add_argument('--headless')chrome_options.add_argument('--no-sandbox')chrome_options.add_argument('--disable-gpu')chrome_options.add_argument('--disable-dev-shm-usage')# 连接Chrome浏览器驱动,获取驱动driver = webdriver.Chrome(chrome_options=chrome_options)'''# 此步骤很重要,设置chrome为开发者模式,防止被各大网站识别出来使用了Seleniumoptions = Options()# 去掉提示:Chrome正收到自动测试软件的控制# options.add_argument('disable-infobars')# 以键值对的形式加入参数,打开浏览器开发者模式# options.add_experimental_option('excludeSwitches', ['enable-automation'])# 打开浏览器开发者模式# options.add_argument("--auto-open-devtools-for-tabs")driver = webdriver.Chrome(chrome_options=options)# driver = webdriver.Chrome()print('连接Chrome浏览器驱动')# 浏览器窗口最大化driver.maximize_window()'''1, 隐式等待方法driver.implicitly_wait(最大等待时间, 单位: 秒)2, 隐式等待作用在规定的时间内等待页面所有元素加载;3,使用场景:在有页面跳转的时候, 可以使用隐式等待。'''driver.implicitly_wait(3)# 强制等待,随机休眠 暂停0-3秒的整数秒,时间区间:[0,3]time.sleep(random.randint(0, 3))except Exception as e:driver = Noneprint(str(e))# 关闭驱动
def close_driver():driver.quit()print('关闭Chrome浏览器驱动')# 检查元素是否存在
def check_element_exists(condition, element):'''@方法名称: 校验判断网页元素是否存在@中文注释: 校验判断网页元素是否存在@入参:@param condition str 网页元素定位条件@param element str 网页元素定位坐标@出参:@返回状态:@return 0 失败@return 1 成功@return 2 异常@返回错误码@返回错误信息@作    者: PandaCode辉@创建时间: 2023-09-21@使用范例: check_element_exists('id', 'username')'''try:if (not type(condition) is str):print('条件参数错误,不是字符串:' + element)return [0, "111111", "条件参数错误,不是字符串", [None]]if (not type(element) is str):print('元素参数错误,不是字符串:' + element)return [0, "111112", "元素参数错误,不是字符串", [None]]# 根据条件定位元素if condition == 'class':driver.find_element(By.CLASS_NAME, element)elif condition == 'id':driver.find_element(By.ID, element)elif condition == 'xpath':driver.find_element(By.XPATH, element)return [1, '000000', "判断网页元素成功", [None]]except Exception as e:return [0, '999999', "判断网页元素是否存在异常," + str(e), [None]]def pc_ttjj_login(username, password):'''@方法名称: 登录天天基金用户@中文注释: 登录天天基金用户@入参:@param username str 登录用户@param password str 登录密码@出参:@返回状态:@return 0 失败或异常@return 1 成功@返回错误码@返回错误信息@作    者: PandaCode辉@创建时间: 2023-09-21@使用范例: ['user123','pwd123']'''try:if (not type(username) is str):return [0, "111111", "登录用户参数类型错误,不为字符串", [None]]if (not type(password) is str):return [0, "111112", "登录密码参数类型错误,不为字符串", [None]]print('开始打开Chrome浏览器驱动')open_driver()print('随机休眠')# 随机休眠 暂停0-2秒的整数秒time.sleep(random.randint(0, 2))print('username:' + username + '/password:' + password)# 登录时请求的urllogin_url = 'https://login.1234567.com.cn/login'driver.get(login_url)print('随机休眠')# 随机休眠 暂停0-2秒的整数秒time.sleep(random.randint(0, 2))# 清空登录框# 通过webdriver对象的find_element_by_xx(" "),在selenium的4.0版本中此种用法已经抛弃。# driver.find_element_by_xpath("./*//input[@id='tbname']").clear()'''通过webdriver模块中的By,以指定方式定位元素导入模块:from selenium.webdriver.common.by import Bydriver.find_element(By.ID,"username")driver.find_element(By.CLASS_NAME,"passwors")driver.find_element(By.TAG_NAME,"imput"'''driver.find_element(By.ID, "tbname").clear()print('输入用户名')# 自动填入登录用户名# driver.find_element_by_xpath("./*//input[@id='tbname']").send_keys(username)driver.find_element(By.ID, "tbname").send_keys(username)print('随机休眠')# 随机休眠 暂停0-2秒的整数秒time.sleep(random.randint(0, 2))# 清空密码框driver.find_element(By.ID, "tbpwd").clear()print('输入密码')# 自动填入登录密码driver.find_element(By.ID, "tbpwd").send_keys(password)print('随机休眠')# 随机休眠 暂停0-2秒的整数秒time.sleep(random.randint(0, 2))# 点击#记住交易帐号driver.find_element(By.ID, "tbcook").click()print('点击记住交易帐号')# 点击#同意服务协议driver.find_element(By.ID, "protocolCheckbox").click()print('点击同意服务协议')# 点击登录按钮进行登录driver.find_element(By.ID, "btn_login").click()print('点击登录按钮')# 等待3秒启动完成driver.implicitly_wait(3)time.sleep(3)print('随机休眠')# 随机休眠 暂停0-2秒的整数秒time.sleep(random.randint(0, 2))# 检查元素是否存在,查看持仓明细元素,用来判断是否登录成功check_rsp = check_element_exists('id', "myassets_hold")if check_rsp[0] == 1:print("登录成功")print('开始关闭Chrome浏览器驱动')close_driver()# 返回容器return [1, '000000', "登录成功", [None]]else:return check_rspexcept Exception as e:print("登录账户异常," + str(e))print('开始关闭Chrome浏览器驱动')close_driver()return [0, '999999', "登录账户异常," + str(e), [None]]# 主方法
if __name__ == '__main__':username = "123456789"password = "password123"# 登录用户rst = pc_ttjj_login(username, password)

第四步:运行测试效果

-------------------------------------------end---------------------------------------

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

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

相关文章

【C++进阶】:哈希

哈希 一.unordered_map二.底层结构1.哈希概念2.解决哈希冲突1.闭散列2.开散列 在C98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到 l o g 2 N log_2N log2​N,即最差情况下需要比较红黑树的高度次,当树中的…

【C++面向对象侯捷】4.参数传递与返回值

文章目录 构造函数放在 private?>单例模式 const member functions(常量成员函数) > 不会改变数据内容的,加上const参数传递:pass by value vs. pass by reference(to const)【最好传引用,占用空间小】返回值传递&#xff1…

Spire.OCR for .NET 1.9.0 Crack

Spire.OCR for .NET 是一个专业的 OCR 库,用于从 JPG、PNG、GIF、BMP 和 TIFF 格式的图像中读取文本。开发人员可以轻松地在 C# 和 VB.NET 的 .NET 应用程序中添加 OCR 功能。它支持常用的图像格式,并提供从图像中​​读取多个字符和字体、粗体和斜体样式…

vue3 知识点(二)

1: 隐藏dom节点 ​ v-if 是注释掉dom节点 ​ v-show 只是改变css样式&#xff1a;display:none&#xff0c;如果对性能有高要求的话&#xff0c;可以使用v-show 2: 点击事件 click 可以把click 改成动态的 [event] <a-button type"primary" [event]"hand…

CDN内容分发系统

CDN 分发系统的架构。CDN 系统的缓存&#xff0c;也是一层一层的&#xff0c;能不访问后端真正的源&#xff0c;就不打扰它。 在没有 CDN 的情况下&#xff0c;用户向浏览器输入 www.web.com 这个域名&#xff0c;客户端访问本地 DNS 服务器的时候&#xff0c;如果本地 DNS 服务…

VSCode 安装使用教程 环境安装配置 保姆级教程

一个好用的 IDE 不仅能提升我们的开发效率&#xff0c;还能让我们保持愉悦的心情&#xff0c;这样才是非常 Nice 的状态 ^_^ 那么&#xff0c;什么是 IDE 呢 &#xff1f; what IDE&#xff08;Integrated Development Environment&#xff0c;集成开发环境&#xff09;是含代码…

获取spring容器中的bean实例

在开发过程中&#xff0c;我们可能需要动态获取spring容器中的某个bean的实例&#xff0c;此时我们就会用到ApplicationContext spring应用上下文&#xff0c;这里做一下记录&#xff0c;网上很多类似的的工具类。 先写好工具类再测试一下是否好用 工具类&#xff1a; packag…

keytool工具生成JKS证书

生成证书 使用jdk keytool生成证书 自建证书不受CA信任&#xff0c;仅适合学习使用&#xff0c;如果需要用到服务中&#xff0c;建议使用由CA颁发的可信证书。如果仅是内部使用&#xff0c;也可以安装自己生成的证书到本机。 生成证书 keytool -genkey -alias jwt -keyalg RS…

Rust踩雷笔记(7)——两个链表题例子初识裸指针

目录 leetcode 234leetcode 19 leetcode 234 题目在这https://leetcode.cn/problems/palindrome-linked-list/&#xff0c;leetcode 234的回文链表&#xff0c;思路很简单&#xff0c;就是fast和slow两个指针&#xff0c;fast一次移动两个、slow一次一个&#xff0c;最后slow指…

docker系列-报错以及解决指南

1. windows运行docker报错Windows Hypervisor is not presentDocker Desktop is unable to detect a Hypervisor.Hardware assisted virtualization and data execution protection must be enabled in the BIOS. Docker Desktop - Windows Hypervisor is not presentDocker D…

推荐一些常用的api接口,包括天气、物流、IP查询等

天气预报查询&#xff1a;支持输入经纬度或者区域编码查询全国以及全球多个城市的天气&#xff0c;包含15天天气预报查询。天气预警&#xff1a;支持输入经纬度或者区域编码&#xff0c;获取指定城市当前生效中的各类天气预警&#xff0c;如寒潮蓝色预警信号&#xff0c;或一次…

java集合之迭代器遍历元素

集合遍历 遍历、迭代、逐个获取容器中的元素 Iterable接口 实现了Iterable接口的类是可以遍历的&#xff0c;因为Iterable接口是Collection接口的父接口&#xff0c;而所有单列集合类都实现了Collection接口&#xff0c;从而也都实现了Iterable接口&#xff0c;所以所有单列集…

基于STM32设计的温室大棚种植监测系统(onenet+GPRS通信)

一、设计简述 基于STM32设计的温室大棚种植监测系统(OneNet+GPRS通信) 1.1 设计需求 随着社会经济的快速发展和人们对食品质量安全的日益关注,温室大棚越来越受到人们的青睐。温室大棚可以提供良好的生长环境,使得蔬菜、水果等植物获得更好的生长条件,从而提高产量和质量。…

Java线程池ThreadPoolExecutor应用(Spring Boot微服务)

记录&#xff1a;475 场景&#xff1a;在Spring Boot微服务中使用Java线程池ThreadPoolExecutor。实现Runnable接口提交线程任务到线程池。 版本&#xff1a;JDK 1.8,Spring Boot 2.6.3。 1.使用注解配置线程池ThreadPoolExecutor (1)说明 ThreadPoolExecutor&#xff0c;…

解决Springboot使用Junit测试时对数据库的修改无效

现象 在使用Junit做单元测试的过程中&#xff0c;比如对mybatis的dao进行单元测试&#xff0c;发现对数据库的select操作正常&#xff0c;可以获取数据&#xff0c;但insert、update、delete操作即使运行不报错&#xff0c;仍然不能不能对数据产生修改和插入。 原因和解决 原…

python 自建kafka消息生成和消费小工具

要将 Kafka 的消息生产和消费转换为 API 接口&#xff0c;我们可以使用 Python 的 Web 框架。其中 Flask 是一个轻量级且易于使用的选择。下面是一个简单的例子&#xff0c;使用 Flask 创建 API 来生成和消费 Kafka 消息。 1. 安装所需的库&#xff1a; pip install kafka-py…

StarRocks 社区:从初生到两周年的进化之路

2021 年 9 月 8 日&#xff0c;StarRocks 开源社区诞生。从第一天开始&#xff0c;我们怀揣着“打造世界一流的数据分析产品”的梦想&#xff0c;踏上了星辰大海的征途。 两年间&#xff0c;StarRocks 在 GitHub 上收获了 5.4K Stars&#xff0c;产品共迭代发布了 90 余个版本&…

Fiddler常用的快键键

Fiddler有很多常用的快捷键&#xff0c;这些快捷键可以帮助你更快速地完成任务。以下是一些常用的快捷键&#xff1a; F12&#xff1a;启动/停止抓包。 CtrlR&#xff1a;打开FiddlerScript窗口。 CtrlH&#xff1a;切换到 Inspector 页签的 Header 视图。 CtrlT&#xff1a;切…

联表查询 索引 事务 JDBC使用 CPU工作原理 线程概念 Thread类的用法

第 1 题&#xff08;单选题&#xff09; 题目名称&#xff1a; 已知表T1中有2行数据&#xff0c;T2中有3行数据&#xff0c;执行SQL语句,“select a.* from T1 a,T2 b”后&#xff0c;返回的行数为 题目内容&#xff1a; A .2 B .3 C .5 D .6 第 2 题&#xff08;单选题…

go语言 反向代理

实现简单的http反向代理 还没有加入负载均衡 新手推荐 下游服务器代码 package mainimport ("fmt""io""log""net/http""os""os/signal""syscall""time" )type RealServer struct {Addr str…