0


python selenium参数详解和案例实现

无头模式添加,可以让selenium模拟登录,进入到后台运行
这里以登录打开公司内网下载数据为例,因为涉及私密问题,所以有些地方我们进行覆盖,还请谅解
先不添加无头模式,进行登录,并且下载文件
因为一般selenium使用的是之前版本的浏览器,所以会出现以下情况,需要进行安全认证,所以可以进行直接忽略认证书的错误
在这里插入图片描述
一般是在selenium的options进行添加

options.add_argument('ignore-certificate-errors')

登录界面
在这里插入图片描述
可以看到上面有很多目录点击过来的,要求下载所有的含有日报的excel,需进行小框选择后,才会出现下载按钮
在这里插入图片描述

下载一般是直接下载到浏览器默认的地址,这里我们可以进行自主修改,还是在options里进行配置,函数如下

# 设置默认地址
prefs ={'download.default_directory':r'D:\desktop\test_download'}
options.add_experimental_option('prefs', prefs)

完整代码如下

# 导入所需要的库import time
import json
import warnings
from selenium import webdriver
from sqlalchemy import create_engine
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 运行时terminal里面会出现好多警告,剔除警告
warnings.filterwarnings('ignore')classDownload():def__init__(self, url, year, path, chrome, username, password, elements):
        self.year = year
        self.url = url
        self.path = path
        self.chrome = chrome
        self.username = username
        self.password = password
        self.elements = elements

    # 浏览器设置defweb_sets(self):
        self.options = webdriver.ChromeOptions()# 因为我使用的是谷歌浏览器
        self.c_service = Service(f'{self.chrome}')
        self.c_service.command_line_args()# 设置后端服务器开始,因为会在后台产生好多服务,为了后面的关闭
        self.c_service.start()# 提供默认下载地址
        self.prefs ={'download.default_directory':f'{self.path}'}
        self.options.add_experimental_option('prefs', self.prefs)# 设置忽略安全证书所带来的错误
        self.options.add_argument('ignore-certificate-errors')# 一些小的设置
        self.options.add_experimental_option('excludeSwitches',["enable-automation"])
        self.options.add_argument('--np-sanbox')
        self.options.add_argument('--disable-dev-shm-usage')# 加属性避免bug
        self.options.add_argument('disable-gpu')# 添加无头模式
        self.options.add_argument('headless')
        self.br = webdriver.Chrome(f'{self.chrome}', chrome_options=self.options)
        self.br.implicitly_wait(3)defloginPage(self):"""
        因为我是将所有元素保存在json文件里面,这样就不需要因为find_element而占用好多列
        也为代码节省地方
        这里需要强调的时find_element(By.XPATH)是最新selenium的使用方法,之前的使用会报错
        """
        self.br.get(self.url)
        time.sleep(4)
        self.br.find_element(By.XPATH,f'{self.elements[keys[2]]}').send_keys(self.username)
        time.sleep(2)
        self.br.find_element(By.XPATH,f'{self.elements[keys[3]]}').send_keys(self.password)
        time.sleep(2)
        self.br.find_element(By.XPATH,f'{self.elements[keys[4]]}').click()
        time.sleep(2)# 设置跳转到最后页面defskipPage(self, url):
        self.br.get(url)
        time.sleep(2)# 下载文件defdownload_excel(self):# 获取所有ul下面的li标签个数
        ul2 = self.br.find_element(By.XPATH,f'{self.elements[keys[6]]}')# 获取li标签数目
        lis2 = ul2.find_elements(By.XPATH,'li')
        time.sleep(1)# 循环li标签for j inrange(len(lis2)):# 因为li的elements都是从1开始,python列表是从0开始,所以要+1
            j+=1# 获取li标签的text
            name = self.br.find_element(By.XPATH,f'{self.elements[keys[7]][1]}'%j).get_attribute('title')print(f'li标签name: {name}')if'日报'in name:print(f'第二遍过滤name: {name}')
                li_test = self.br.find_element(By.XPATH,f'{self.elements[keys[8]]}'%j)
                self.br.execute_script('arguments[0].click();',li_test)
                time.sleep(0.5)
                self.br.find_element(By.XPATH,f'{self.elements[keys[9]]}').click()
                time.sleep(0.5)
                li_test2 = self.br.find_element(By.XPATH,f'{self.elements[keys[8]]}'%j)
                time.sleep(1)# 设置点击覆盖,以防止报错# 因为一直要模拟点击选择文件,然后进行下载文件,防止点击覆盖
                self.br.execute_script("arguments[0].click();", li_test2)
                time.sleep(8)
        time.sleep(10)
        time.sleep(12)# 退出浏览器,推出后台服务# c_service.stop()对应之前的c_service.stop()
        self.br.quit();self.c_service.stop()

JSON文件
json文件

ul标签的展示
在这里插入图片描述
li标签下的title
获取li标签内div的title
在这里顺便讲下如何获取xpath的绝对路径或者相对路径
在这里插入图片描述
在这里插入图片描述
展示下ul标签相对路径和绝对路径

xpath://*[@id="main"]/div[2]/div/div[3]/div[1]/as-dataview/div[2]/ul
full_xpath:/html/body/div[2]/div[1]/div[2]/div/div[1]/div[2]/div/div[3]/div[1]/as-dataview/div[2]/ul

下图是没有c_service.stop(),后台运行服务,不能进行关闭
在这里插入图片描述

运行代码

if __name__ =='__main__':
    jsonFile =r'JsonFile\elements.json'withopen(jsonFile,'r')as f:
        row_data = json.load(f)# 获取所有json的键
    keys =list(row_data.keys())# 读取账号和密码
    filename = row_data[keys[0]]# 获取账号和密码txtwithopen(filename,'r')as f:
        data = f.read()
    data1 = data.split('\n')
    url ='url'# chromedriver.exe
    chrome =r'chromedriver.exe'
    username = data1[0]
    password = data1[1]
    path = row_data[keys[1]]
    year = time.gmtime().tm_year
    start = Download(url, year, path, chrome, username, password, row_data)
    start.web_sets()
    start.loginWeb()
    e = row_data[keys[5]]
    start.skipPage(e)
    start.download_excel()
    time.sleep(15)

为了展示出来 取消掉无头模式 这样可以看到浏览器进行下载
在这里插入图片描述
在这里插入图片描述
可以看到只有含有’日报’的数据被下载了,并且任务管理器里面没有刚才出现的Chrome32的服务
在这里插入图片描述
如果有不懂得欢迎随时来问,或者有不同见解的欢迎随时讨论

标签: 1024程序员节

本文转载自: https://blog.csdn.net/KIKI_ZSH/article/details/127493820
版权归原作者 Vergil_Zsh 所有, 如有侵权,请联系我们删除。

“python selenium参数详解和案例实现”的评论:

还没有评论