python使用selenium模拟人工操作

概述

有时候业务中的一些固定流程的测试环境需要重复执行很多次;这种场景其实可以用pythonselenium库模拟用户手动点击输入,实现自动化测试;

我这边的python版本是
Python 3.6.7rc2

demo

# coding=utf-8
import time
import logging
import re
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChainsdef login(driver):url = "http://192.168.xxx.xxx/xxx/xxx/add"# 打开网页driver.get(url)  # 打开url网页 比如 driver.get("http://www.baidu.com")login_user_name_xpath = '//*[@id="userName"]'login_user_passwd_xpath = '//*[@id="password"]'# 等待登录账户输入框dom加载wait_xpath_dom_loading(driver, login_user_name_xpath)wait_xpath_dom_loading(driver, login_user_passwd_xpath)# 登录自动获得tokendriver.find_element_by_xpath(login_user_name_xpath).send_keys('xxx')driver.find_element_by_xpath(login_user_passwd_xpath).send_keys('xxx')driver.find_element_by_xpath('//*[@id="root"]/div/div/div/div[2]/form/button').click()# 等待登录后的网页跳转time.sleep(2)return driverdef memberFillDataAndSubmit_01(driver):url = "http://xxx.xxx.xxx.xxx/xxx/xxx/add"# 打开网页driver.get(url)# 等待页面加载time.sleep(2)try:driver.find_element_by_xpath('//*[@id="root"]/div/section/div[2]/main/div/div[1]/div[4]/div/div/div/div/ul')except:print('未找到分页元素,当前页面已无数据')return driver# 填充数据driver.find_element_by_xpath('//*[@id="root"]/div/section/div[2]/main/div/div[1]/div[3]/div[2]/div[2]/div/div[2]/input').send_keys("2")driver.find_element_by_xpath('//*[@id="root"]/div/section/div[2]/main/div/div[1]/div[3]/div[3]/div[2]/div/div[2]/input').send_keys("3.5")for count in range(0,170):# 页面一件填充按钮driver.find_element_by_xpath('//*[@id="root"]/div/section/div[2]/main/div/div[1]/div[3]/button').click()# 数据全选按钮driver.find_element_by_xpath('//*[@id="root"]/div/section/div[2]/main/div/div[1]/div[4]/div/div/div/div/div/div/div[1]/table/thead/tr/th[1]/div/label/span/input').click()# 数据提交driver.find_element_by_xpath('//*[@id="root"]/div/section/div[2]/main/div/div[1]/div[2]/div[2]/div[3]/button').click()# 等待页面加载time.sleep(2)return driverdef memberFillDataAndSubmit_02(driver):url = "http://xxx.xxx.xxx.xxx/xxx/xxx/add"# 打开网页driver.get(url)# 等待页面加载time.sleep(2)try:driver.find_element_by_xpath('//*[@id="root"]/div/section/div[2]/main/div/div[1]/div[4]/div/div/div/div/ul')except:print('未找到分页元素,当前页面已无数据')return driver# CA填报driver.find_element_by_xpath('//*[@id="advanced_search"]/div/div[1]/div[2]').click()# 等待页面加载time.sleep(2)# 填充数据driver.find_element_by_xpath('//*[@id="root"]/div/section/div[2]/main/div/div[1]/div[3]/div[2]/div[2]/div/div[2]/input').send_keys("2")driver.find_element_by_xpath('//*[@id="root"]/div/section/div[2]/main/div/div[1]/div[3]/div[3]/div[2]/div/div[2]/input').send_keys("3.5")for c in range(0,24):# 页面一件填充按钮driver.find_element_by_xpath('//*[@id="root"]/div/section/div[2]/main/div/div[1]/div[3]/button').click()# 数据全选按钮driver.find_element_by_xpath('//*[@id="root"]/div/section/div[2]/main/div/div[1]/div[4]/div/div/div/div/div/div/div[1]/table/thead/tr/th[1]/div').click()# 数据提交driver.find_element_by_xpath('//*[@id="root"]/div/section/div[2]/main/div/div[1]/div[2]/div[2]/div[3]/button').click()# 等待页面加载time.sleep(2)return driverdef groupDataCheckAndSubmitWrapper(driver):url = "http://xxx.xxx.xxx.xxx/xxx/xxx/manager"# 状态下拉框xpathstatus_optional_xpath = '//*[@id="advanced_search"]/div/div[5]/div/div/div[2]/div/div/div'# 当前页面数据全选current_page_total_choice_xpath = '//*[@id="rc-tabs-0-panel-2"]/div[2]/div[3]/div/div/div/div/div/div[1]/table/thead/tr/th[1]/div/label'# 状态下拉框中option xpathstatus_optional_wait_check_xpath = '/html/body/div[2]/div/div/div/div[2]/div/div/div/div[3]'# 查询按钮xpathquery_btn_xpath = '//*[@id="advanced_search"]/div/div[19]/div/div[2]/button'# 打开网页driver.get(url)time.sleep(5)# 等待数据全选渲染完毕(数据请求完毕)wait_xpath_dom_loading(driver, current_page_total_choice_xpath)# 创建ActionChains对象actions = ActionChains(driver)# 点击唤出状态下拉框status_optional = driver.find_element_by_xpath(status_optional_xpath)actions.move_to_element(status_optional).perform()status_optional.click()time.sleep(1)# 点击待审核状态click_delay_time(driver, status_optional_wait_check_xpath)# 重新查询click_delay_time(driver, query_btn_xpath)time.sleep(3)submit_type_xpath_list = [# 标签页2'//*[@id="rc-tabs-0-panel-2"]/div[1]/div/div[2]/label[2]',# 标签页3'//*[@id="rc-tabs-0-panel-2"]/div[1]/div/div[3]/label[2]',# 标签页4'//*[@id="rc-tabs-0-panel-2"]/div[1]/div/div[4]/label[2]']# 首次进入页面,查询标签页1数据groupDataCheckAndSubmit(driver, actions)for submit_type_xpath in submit_type_xpath_list:driver.find_element_by_xpath(submit_type_xpath).click()time.sleep(10)# 数据审核提交groupDataCheckAndSubmit(driver, actions)def groupDataCheckAndSubmit(driver, actions):# 状态筛选下拉浮窗hover位置check_submit_hover_position_xpath = '//*[@id="rc-tabs-0-panel-2"]/div[2]/div[2]/div[2]/div[1]/div/div[2]/button'# 浮窗中 通过并提交 按钮xpathpass_and_submit_xpath = '/html/body/div[3]/div/div/ul/li[2]/span/a'# 当前页面数据全选current_page_total_choice_xpath = '//*[@id="rc-tabs-0-panel-2"]/div[2]/div[3]/div/div/div/div/div/div[1]/table/thead/tr/th[1]/div/label'# 审核按钮hover位置dom加载wait_xpath_dom_loading(driver, check_submit_hover_position_xpath)# 审核按钮hover位置check_submit_hover_position = driver.find_element_by_xpath(check_submit_hover_position_xpath)try:# 通过class获取分页litotal_page_li_list = driver.find_element_by_class_name('ant-pagination').find_elements_by_tag_name('li')# 过滤获取页码对应xpath对象page_li_list = list(filter(get_max_page_num, total_page_li_list))total_page_num = int(page_li_list[len(page_li_list) - 1].get_attribute('title'))# 没有数据if 0 == total_page_num: return driverexcept Exception as e:# 没有数据时当前页面没有渲染分页下标logging.exception(e)return driverfor count in range(0,total_page_num):# 提交后页面重新加载time.sleep(5)# 数据全选wait_xpath_dom_loading(driver, current_page_total_choice_xpath)click_delay_time(driver, current_page_total_choice_xpath)# 进行重置坐标actions.reset_actions()# 鼠标悬停,唤出按钮actions.move_to_element(check_submit_hover_position).perform()# js加载time.sleep(2)# 鼠标hover到审核通过按钮上.ran后点击按钮check_and_submit_btn = driver.find_element_by_xpath(pass_and_submit_xpath)# actions.move_to_element(check_and_submit_btn).perform()# js加载#time.sleep(1)# 通过并提交check_and_submit_btn.click()return driver# WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
# driver: 浏览器驱动
# timeout: 最长超时时间
# poll_frequency: 检测间隔时间,默认0.5s
# ignored_exceptions: 超时后的异常信息,默认情况抛出NoSuchElementException异常
# 一般由until()或until_not方法配合使用,下面是这两种方法的说明:
# until(method, message=''): 调用该方法提供的驱动程序作为一个参数,直到返回值为True;
# until_not(method, message=''): 调用该方法提供的驱动程序作为一个参数,直到返回值为Flase;
def wait_xpath_dom_loading(driver, xpath):locator = (By.XPATH, xpath)WebDriverWait(driver, 10, 1).until(EC.presence_of_element_located(locator))def click_delay_time(driver, xpath):driver.find_element_by_xpath(xpath).click()time.sleep(2)def get_max_page_num(xpath_obj):return re.match('\d', xpath_obj.get_attribute('title'))if __name__ == '__main__':driver_path = 'D:\chromeDownLoad\chromedriver-win64\chromedriver.exe'driver = webdriver.Chrome(driver_path)  # Chrome浏览器# 设置全局等待超时时间5sdriver.implicitly_wait(5)try:# 登录driver = login(driver)# 数据填报提交memberFillDataAndSubmit_01(driver)# 数据填报提交memberFillDataAndSubmit_02(driver)# 组长数据审核提交groupDataCheckAndSubmitWrapper(driver)except Exception as e:logging.exception(e)# 关闭浏览器driver.quit()

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

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

相关文章

Debian 安装 python 3.9.6

安装相关依赖 sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libsqlite3-dev libreadline-dev libffi-dev curl libbz2-dev 下载Python 源码 wget https://mirrors.aliyun.com/python-release/source/Py…

基于R语言BIOMOD2模型的物种分布模拟

随着生物多样性全球大会的举办,不论是管理机构及科研单位、高校都在积极准备,根据国家林草局最新工作指示,我国将积极整合、优化自然保护地,加快推进国家公园体制试点,构建以国家公园为主体的自然保护地体系。针对我国…

Spring 如何优雅的灵活的Http重试

1、背景说明 在互联网时代, 不同系统之间大多数是通过http调用,调用过程中会超时、异常等过种问题。为了保证业务稳定,http 重试是常用方案。下面列举几种方案。 2、Http重试方案介绍 2.1 传统方案 1、使用传统的递归调用,实现方…

SQL 注入之 Windows/Docker 环境 SQLi-labs 靶场搭建!

在安全测试领域,SQL注入是一种常见的攻击方式,通过应用程序的输入执行恶意SQL查询,从而绕过认证和授权,可以窃取、篡改或破坏数据库中的数据。作为安全测试学习者,如果你要练习SQL注入,在未授权情况下直接去…

深入浅出 -- 系统架构之负载均衡Nginx实现高可用

一、Nginx的高可用 线上如果采用单个节点的方式部署Nginx,难免会出现天灾人祸,比如系统异常、程序宕机、服务器断电、机房爆炸、地球毁灭....哈哈哈,夸张了。但实际生产环境中确实存在隐患问题,由于Nginx作为整个系统的网关层接入…

安卓手机APP开发的音频和视频概述

安卓手机APP开发的音频和视频概述 目录 概述 Jetpack Media3 回放组件 Media3 MediaSession MediaSessionService MediaController MeidaBrowser Media3 Exoplayer 编辑组件 Media3 Transformer Effects EditedMediaItem UI组件 Media3 UI Jetpack MediaRouter…

anylabeling使用和安装

源码地址: git clone https://github.com/vietanhdev/anylabeling.git Auto Labeling with Segment Anything Youtube Demo: https://www.youtube.com/watch?v5qVJiYNX5KkDocumentation: https://anylabeling.nrl.ai Features: Image annotation for polygon, r…

利用Leaflet + React:构建WEBGIS

React是 Facebook 开发的一个开源库,用于构建用户界面。就其本身而言,Leaflet是一个用于将地图发布到网络的JavaScript 库。这两个工具的组合很简单,允许您创建动态网络地图。在本文中,我们将看到这种组合的一些特征以及一些简单的…

查找题(二分解法c++)

文章目录 【深基13.例1】查找题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示代码如下: 【深基13.例1】查找 题目描述 输入 n n n 个不超过 1 0 9 10^9 109 的单调不减的(就是后面的数字不小于前面的数字)非负整数 a 1 , a…

数据结构DAY3--栈与队列

栈: 是一种只能从一端操作的表,规则为先进后出。 主要操作步骤为:1.建立相关结构体 2.建立栈 3.增加栈 4.获得栈顶值 5.删除 6.修改 7.销毁 1.建立两个结构体 一个为链栈,一个为结点,链栈包括栈头(指针…

多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络多输入多输出预测

多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络…

java数据结构与算法刷题-----LeetCode367. 有效的完全平方数

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 自实现Math.sqrt()函数:牛顿迭代法 自实现Math.sqrt(…

Redis单线程 VS 多线程

一、Redis 为什么选择单线程? 这种说法其实并不严谨,为什么这么说呢? Redis的版本有很多 3.x、4.x、6.x,版本不同架构也不同的,不限定版本问是否单线程也是不太严谨。 版本3.x,最早版本,也就…

项目架构MVC,DDD学习

写在前面 本文一起看下项目架构DDD,MVC相关的内容。 1:MVC 不管我们做什么项目,自己想想其实只是做了三件事,如下: 其实,这三件事完全在一个类中做完也可以可以正常把项目完成的,就像下面这…

【MacBook系统homebrew镜像记录】

安装 使用Homebrew 国内源安装脚本,贼方便: /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"切换至清华大学镜像源: 命令合并: 分别切换了 brew.git、 homebrew-core.git、 homebrew-…

逆向案例十二——看准网企业信息json格式的信息

网址:【全国公司排行|排名榜单|哪家好】-看准网 打开开发者工具——刷新——网络——XHR——下滑页面加载新的页面——找到数据包 发现参数加密,返回的数据也进行了加密 按关键字在下方搜索 kiv进入第一个js文件 ctrlf打开文件里面的搜索框继续搜kiv找到…

12.手写JavaScript bind方法

一、核心思想 bind相比apply和call引入了闭包的思想,重点是正确找到this和arguments 二、代码实现 /*** 手写bind* param {Function} o 函数* param {Array} ...args1 数组* return 根据具体情况考虑*/ function Fn(a,b,c,d){console.log("this.name:"…

Java 面试宝典:Redis 的线程模型是怎么样的?

大家好,我是大明哥,一个专注「死磕 Java」系列创作的硬核程序员。 本文已收录到我的技术网站:https://www.skjava.com。有全网最优质的系列文章、Java 全栈技术文档以及大厂完整面经 Redis 的线程模型其实是分两块的: Redis 6.0 …

前端开发语言有那些?

前端开发语言有那些? 1、html 超文本标记语言:构建前端网页的基本结构,就象人的骨架一样。 2、css 层叠样式表:控制网页的样式和布局,就象人需要穿各种服式展现不同风采。 3、javascript 简称 JS 动态脚本语言&#x…

阿里面试总结

ThreadLocal 线程变量存放在当前线程变量中,线程上下文中,set将变量添加到threadLocals变量中 Thread类中定义了两个ThreadLocalMap类型变量threadLocals、inheritableThreadLocals用来存储当前操作的ThreadLocal的引用及变量对象,把当前线程…