一、需求简述
适用于后台系统任务、商品信息、订单等场景的批量操作,本文章设计背景为后台系统需要重复审核任务状态,这里仅作审核通过场景,审核失败场景可扩展补充,实现逻辑大同小异;
页面操作逻辑如下:
- 登录后台系统
- 输入用户名、密码、验证码(这里验证码为固定验证码,动态验证码可利用(mysql.connector模块从数据库中获取,可参考之前操作数据库相关的文章)
- 进入系统子页面,点击至系统的三级页面
- 输入用户id
- 筛选任务状态(审核中任务)
- 点击审核(此处为了方便用了系统自带的【一键审核】功能,多条数据的批量审核可使用循环遍历的方法自行扩展)
- 审核二级确认框
- 审核三级确认框
- 审核完成
二、设计思路
1、单个脚本不做区分,仅覆盖当前一种场景,故仅定义一个函数在主函数中调用
2、主函数中优先使用input方法将用户ID存入变量中,方便后续使用
3、引用模块,如下
????????
from selenium import webdriver
from selenium.webdriver.chrome.service import Service #驱动指向
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException #捕获异常信息
from time import sleep
from selenium .webdriver.support.select import Select #用于下拉框元素定位
4、指定操作浏览器驱动:chrome
????????
wd = webdriver.Chrome(service=Service(r'F:\selenium_chrome\chromedriver_win32\chromedriver.exe'))
5、登录后台
????????
# 后台执行登录操作
wd.get('http://dexxxxm/data/task/index')
wd.maximize_window()
element = wd.find_element(By.NAME, 'info[username]')
element.send_keys('Thinkel')
element_pwd = wd.find_element(By.NAME, 'info[password]')
element_pwd.send_keys('Thinkel')
elemen_vf = wd.find_element(By.NAME, 'info[verify]')
elemen_vf.send_keys('1111')
#尝试定位【登录】按钮,定位失败则回车键登入
try:
element_bt = wd.find_element(By.CSS_SELECTOR, 'btn green pull-right')
element_bt.click()
print("后台登入成功")
except NoSuchElementException:
elemen_vf.send_keys('\n')
print("后台登入成功")
sleep(3)
6、筛选需要操作的数据
????????
wd.get('http://dev1318.xxxx.com/data/task/index')
sleep(2)
#输入用户ID
elemen_userId = wd.find_element(By.ID,'userId')
elemen_userId.send_keys(userId)
#定位下拉框选项为【截图审核中】
sel = wd.find_element(By.ID,'subStatus')
Select(sel).select_by_value('4')
sleep(2)
#尝试定位【搜索】按钮,这里用的绝对路径,容易出bug
try:
element_search1 = wd.find_element(By.XPATH,'/html/body/div[3]/div[2]/div[2]/div[2]/div/div/div/div/div[1]/div/form/div[3]/span/button[1]')
element_search1.click()
print("【待审核任务】查询成功,即将进行审核操作.....")
except NoSuchElementException:
print("没有找到【搜索】按钮,请检查页面布局是否变更")
wd.quit()
sleep(2)
7、判断筛选之后是否存在符合条件的待审核数据
????????
#定位页面是否有【审核】样式按钮,判断当前用户是否有可操作的任务数据
try:
wd.find_element(By.XPATH,"//*[contains(@class,'fa fa-edit')]")
except NoSuchElementException:
print("该用户没有需要审核的任务,请确认后再试")
wd.quit()
#【一键审核】选择data-target属性值 包含#myModalAll字符串的页面元素
examine = wd.find_element(By.XPATH,"//*[contains(@data-target,'#myModalAll')]")
examine.click()
sleep(2)
#点击【变更审核成功】按钮
change = wd.find_element(By.XPATH,"//*[contains(@onclick,'updateStatusAll()')]")
change.click()
sleep(2)
#二次确认弹窗
determine = wd.find_element(By.CLASS_NAME,'layui-layer-btn0')
determine.click()
sleep(5)
8、主函数调用
????????
if __name__=="__main__":
userId = int(input("请输入你的用户ID:\n"))
Sign()
print("审核已完成")
三、代码实现
????????
from selenium import webdriver
from selenium.webdriver.chrome.service import Service #驱动指向
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException #捕获异常信息
from time import sleep
from selenium .webdriver.support.select import Select #用于下拉框元素定位
# 后台登入
def Sign():
# 指定浏览器驱动位置
wd = webdriver.Chrome(service=Service(r'F:\selenium_chrome\chromedriver_win32\chromedriver.exe'))
# 后台执行登录操作
wd.get('http://dev1318.admin.xxxia.com/data/task/index')
wd.maximize_window()
element = wd.find_element(By.NAME, 'info[username]')
element.send_keys('Thinkel')
element_pwd = wd.find_element(By.NAME, 'info[password]')
element_pwd.send_keys('Thinkel')
elemen_vf = wd.find_element(By.NAME, 'info[verify]')
elemen_vf.send_keys('1111')
#尝试定位【登录】按钮,定位失败则回车键登入
try:
element_bt = wd.find_element(By.CSS_SELECTOR, 'btn green pull-right')
element_bt.click()
print("后台登入成功")
except NoSuchElementException:
elemen_vf.send_keys('\n')
print("后台登入成功")
sleep(3)
wd.get('http://dev1318.admin.zxxxia.com/data/task/index')
sleep(2)
#输入用户ID
elemen_userId = wd.find_element(By.ID,'userId')
elemen_userId.send_keys(userId)
#定位下拉框选项为【截图审核中】
sel = wd.find_element(By.ID,'subStatus')
Select(sel).select_by_value('4')
sleep(2)
#尝试定位【搜索】按钮,这里用的绝对路径,容易出bug
try:
element_search1 = wd.find_element(By.XPATH,'/html/body/div[3]/div[2]/div[2]/div[2]/div/div/div/div/div[1]/div/form/div[3]/span/button[1]')
element_search1.click()
print("【待审核任务】查询成功,即将进行审核操作.....")
except NoSuchElementException:
print("没有找到【搜索】按钮,请检查页面布局是否变更")
wd.quit()
sleep(2)
#定位页面是否有【审核】样式按钮,判断当前用户是否有可操作的任务数据
try:
wd.find_element(By.XPATH,"//*[contains(@class,'fa fa-edit')]")
except NoSuchElementException:
print("该用户没有需要审核的任务,请确认后再试")
wd.quit()
#【一键审核】选择data-target属性值 包含#myModalAll字符串的页面元素
examine = wd.find_element(By.XPATH,"//*[contains(@data-target,'#myModalAll')]")
examine.click()
sleep(2)
#点击【变更审核成功】按钮
change = wd.find_element(By.XPATH,"//*[contains(@onclick,'updateStatusAll()')]")
change.click()
sleep(2)
#二次确认弹窗
determine = wd.find_element(By.CLASS_NAME,'layui-layer-btn0')
determine.click()
sleep(5)
if __name__=="__main__":
userId = int(input("请输入你的用户ID:\n"))
Sign()
print("审核已完成")
四、技术要点
- id定位:elemen_userId = wd.find_element(By.ID,'userId')
- name定位:element_pwd = wd.find_element(By.NAME, 'info[password]')
- CSS_SELECTOR:element_bt = wd.find_element(By.CSS_SELECTOR, 'btn green pull-right')
- XPATH绝对路径:
- /html/body/div[3]/div[2]/div[2]/div[2]/div/div/div/div/div[1]/div/form/div[3]/span/button[1]
- XPATH匹配字符串:
- //*[contains(@class,'fa fa-edit')]
- CLASS_NAME
|