首页 > 编程语言 >基于python+selenium的自动批量添加

基于python+selenium的自动批量添加

时间:2023-09-15 16:11:59浏览次数:28  
标签:批量 python 元素 selenium li print element CSS browser

场景

点击添加”新增“按钮,弹出”新增对话框“,输入各种数据,然后点击”确定“按钮,如此循环。数量多,这样操作累人。

selenium

Selenium 是一个用于自动化 Web 浏览器操作的库,可以实现模拟点击、输入文本等操作。

代码实现

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.common.exceptions import ElementNotInteractableException
from selenium.common.exceptions import ElementNotSelectableException
from selenium.common.exceptions import InvalidSelectorException
from selenium.common.exceptions import NoSuchAttributeException
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoSuchFrameException
from selenium.common.exceptions import NoSuchWindowException
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
import time

# 目标页面
target_url = "https://test.abc.com/12311/application/#/application/update/2310?mode=edit&env=prod"

# 创建一个Chrome浏览器实例
#browser = webdriver.Chrome(executable_path=driver_path)
browser = webdriver.Chrome()

# 打开一个网页
browser.get(target_url)
time.sleep(0.5)

try:
    # 点击“快速登录”按钮
    print('模拟点击“快速登录”按钮')
    browser.find_element(
        By.ID, "btn_quicklogin"
    ).click()
    time.sleep(1)

    print('模拟点击“下一步”按钮')
    # 使用 class 属性定位
    button = browser.find_element(By.CSS_SELECTOR, ".footer>button")
    button.click()
    time.sleep(1)

    # 填充
    for index, metric_pair in enumerate(metric_pair_array):
        metric = metric_pair.split(':')
        print("\033[93m==============================\033[0m")
        print("(%d) %s" % (len(metric), metric_pair))
        if len(metric) == 2:
            metric_name = metric[0]
            li_element_index = index * 10
            print("metric_name:%s, index:%d, li_element_index:%d" % (metric_name, index, li_element_index))

            # 点击“新增”按钮
            browser.find_element(
                By.CSS_SELECTOR, ".table-view__operations-left>.t-button--theme-primary"
            ).click()
            time.sleep(1)

            # 中文名
            browser.find_element(By.CSS_SELECTOR, ".t-form-item__metric_chname .t-input__inner").send_keys(metric_name)

            # 英文名
            browser.find_element(By.CSS_SELECTOR, ".t-form-item__metric_enname .t-input__inner").send_keys(metric_name)

            # 类型
            print('点击“箭头”按钮')
            browser.find_element(
                By.CSS_SELECTOR, ".t-form-item__type .t-input--suffix"
            ).click()
            li_elements = browser.find_elements(By.CSS_SELECTOR, ".t-select__dropdown .t-select__list .t-size-m") # li_elements 为大小为 4 的 list
            print("type of li_elements: %s" % type(li_elements))
            if isinstance(li_elements, list): # 判断元素是否为列表类型
                print("size of li_elements: %s" % len(li_elements))
            target_li = li_elements[0 + li_element_index]
            target_li.click()

            # 单位
            print('点击“箭头”按钮')
            browser.find_element(
                By.CSS_SELECTOR, ".t-form-item__unit .t-input--suffix"
            ).click()
            li_elements = browser.find_elements(By.CSS_SELECTOR, ".t-select__dropdown .t-select__list .t-size-m") # li_elements 为大小为 10 的 list,包含了前面一步得到的 4 个
            print("type of li_elements: %s" % type(li_elements))
            if isinstance(li_elements, list):
                print("size of li_elements: %s" % len(li_elements))
                target_li = li_elements[6 + li_element_index]
                target_li.click()

            # 点击“确定”按钮
            browser.find_element(
                By.CSS_SELECTOR, ".t-dialog__footer .t-button--theme-primary"
            ).click()

            print("")
except ElementNotInteractableException:
    print(u"Element not interactable: %s" % (msg))
except ElementNotSelectableException as msg:
    print(u"Element not selected: %s" % (msg))
except InvalidSelectorException as msg:
    print(u"Invalid selector: %s" % (msg))
except NoSuchAttributeException as msg:
    print(u"Attribute not found: %s" % (msg))
except NoSuchElementException as msg:
    print(u"Element not found: %s" % (msg))
except NoSuchFrameException as msg:
    print(u"Frame not found: %s" % (msg))
except NoSuchWindowException as msg:
    print(u"Window not found: %s" % (msg))
except TimeoutException as msg:
    print(u"Find element timeout: %s" % (msg))
else:
    input('按 “Enter” 键退出 ...')

# 关闭浏览器
#browser.quit()

find_element

在 Selenium 中,find_element 方法用于定位页面元素,通常与 CSS 选择器一起使用。在 CSS 选择器中,>和空格有着不同的含义:

  • .

这是一个类选择器。它选择所有具有指定类名的元素。例如 .myClass 会选择所有具有类名 myClass 的元素。

  • >

这是一个子元素选择器。它选择所有直接的子元素。例如,div > p 会选择所有 div 元素的直接子元素 p。

  • 空格

这是一个后代选择器。它选择所有的子元素,不仅仅是直接的子元素,还包括孙子元素、曾孙元素等。例如,div p 会选择 div 元素下的所有 p 元素,无论p元素是 div 的直接子元素,还是更深层次的后代元素。

这两个选择器在定位元素时非常有用,可以帮助更精确地选择想要的元素。如果目标存在多个,则应当使用 find_elements。

By.CSS_SELECTOR 和 By.CLASS_NAME

在 Selenium 中,By.CSS_SELECTOR 和 By.CLASS_NAME 都是用于定位页面元素的方法,但它们的使用方式和目标有所不同。

  • By.CSS_SELECTOR

这个方法允许使用 CSS 选择器来定位页面元素。CSS 选择器是一种强大的定位方式,可以通过元素的属性、层次结构和伪类等来定位元素。例如,可以使用 By.CSS_SELECTOR 来定位具有特定 ID、类名、属性或子元素的元素。

# 定位具有特定ID的元素
element = browser.find_element(By.CSS_SELECTOR, "#element_id")

# 定位具有特定类名的元素
element = browser.find_element(By.CSS_SELECTOR, ".element_class")

# 定位具有特定属性的元素
element = browser.find_element(By.CSS_SELECTOR, "input[type='text']")

# 定位具有特定子元素的元素
element = browser.find_element(By.CSS_SELECTOR, "div > p")
  • By.CLASS_NAME

这个方法专门用于定位具有特定类名的元素。它只能通过类名来定位元素,而不能使用其他属性或层次结构。如果只需要根据类名来定位元素,By.CLASS_NAME 是一个简单直接的选择。

# 定位具有特定类名的元素
element = browser.find_element(By.CLASS_NAME, "element_class")

总之,By.CSS_SELECTOR 提供了更多的灵活性和定位能力,而 By.CLASS_NAME 则专注于通过类名来定位元素。根据需求和目标元素的特点,可以选择使用适当的方法来定位页面元素。

标签:批量,python,元素,selenium,li,print,element,CSS,browser
From: https://www.cnblogs.com/aquester/p/17705250.html

相关文章

  • pip国内镜像源-Python安装第三方库
    众所周知,在没有配置第三方库的时候,使用pip或者conda安装包的时候,会直接指向Python官网,由于服务器在国外,下载速度会很慢,因此,大多数情况下会选择国内的镜像源网址来提升安装第三方库的速度。1.8个国内镜像源以下是中国常见的pip镜像源,按照完全度和下载速度排序,需要注意的是,镜像源......
  • 【Python&GIS】解决GIS属性表、矢量字段乱码,中文乱码
    ​    我们平时在使用代码处理矢量数据时,可能会出现矢量字段出现乱码的情况。同样有什么打开别人发的矢量文件有可能也会出现这种情况。那么我们该如何解决这个问题,让我们属性表中的中文字符正常显示呢?今天就和大家一起分享一下。1.原因        ArcGIS10.2之......
  • Python——19days
    模块的简介**模块导入的方式             import句式,from……import…句式模块的其他用法补充循环导入(现象)判断文件类型———————————————————————————————————                 ......
  • 关于python中os模块指向软链路径
    关于pythonos模块获取路径问题如果py文件放在软链路径下,那么无法获取当前路径,只能获取软链对应的真实路径Python3.8.2创建软链路径#1.在/System/Volumes/Data创建ccc目录mkdir-p/System/Volumes/Data/ccc#2.创建软链:test_ccc->/System/Volumes/Data/ccccd~&......
  • django—实现前端页面批量删除功能
    views.py代码:fromdjango.shortcutsimportrender,redirectfrom.modelsimportYourModel#使用你实际的模型名称替换defbatch_delete(request):ifrequest.method=='POST':ids=request.POST.get('ids')ifids:......
  • linux里python读写mssql数据库的笔记
    1、安装pyodbcpip3installpyodbc我用的debian12,可以直接aptinstallpython3-pyodbc2、还需要安装linux版的mssqlclient参考这里:https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver......
  • 【Python】Python 发布订阅模式实现松耦合
    Python发布订阅模式实现松耦合发布订阅模式(publish/subscribe或pub/sub)是一种编程模式,消息的发送者(发布者)不会发送其消息给特定的接收者(订阅者),而是将发布的消息分为不同的类别直接发布,并不关注订阅者是谁。而订阅者可以对一个或多个类别感兴趣.且只接收感兴趣的消息,并且......
  • bindizip批量压缩解压(xjl456852原创)
    linux使用bindizip需要在wine下使用.linux批量解压缩脚本(xjl456852原创):脚本名: unpack.sh,可以将脚本放入到/usr/bin/bash下进行使用更方便没有加入-y参数,所以解压完成后不会自动关闭窗口,需要自己手动关闭窗口.因为需要检测是否有错误.如果不想检测是否有错误,可以使用下面......
  • 一个简单的 Python 实现希尔伯特-黄变换(Hilbert-Huang Transform,简称HHT)的例子
     importnumpyasnpfromscipy.signalimportargrelextremadefemd(data):"""经验模式分解(EmpiricalModeDecomposition,EMD)"""#找到极值点max_points,min_points=argrelextrema(data,np.greater,axis=0)max......
  • 「乱搞」用 Python 处理 word 文档
    目录写在前面代码写在最后写在前面大家好啊,我是过气up主Luckyblock,今天给大家来点想看的东西。简单记录如何使用Python中的python-docx模块快速处理word文档。周末就是省赛了,然而板子还没整合起来。因为我是一个懒狗,懒得把代码再慢慢复制进文档里了,于是来学了这个。......