python+selenium常用定位元素与web自动化测试实例

一、需求简述

适用于后台系统任务、商品信息、订单等场景的批量操作,本文章设计背景为后台系统需要重复审核任务状态,这里仅作审核通过场景,审核失败场景可扩展补充,实现逻辑大同小异;

页面操作逻辑如下:

  • 登录后台系统
  • 输入用户名、密码、验证码(这里验证码为固定验证码,动态验证码可利用(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

你可能感兴趣的:(python,selenium,web自动化,chrome,python,前端,selenium)