python selenium参数详解和实现案例
作者:Vergil_Zsh 发布时间:2023-09-25 01:20:29
标签: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')
class Download():
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
# 浏览器设置
def web_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)
def loginPage(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)
# 设置跳转到最后页面
def skipPage(self, url):
self.br.get(url)
time.sleep(2)
# 下载文件
def download_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 in range(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文件
ul标签的展示
li标签下的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'
with open(jsonFile, 'r') as f:
row_data = json.load(f)
# 获取所有json的键
keys = list(row_data.keys())
# 读取账号和密码
filename = row_data[keys[0]]
# 获取账号和密码txt
with open(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的服务
来源:https://blog.csdn.net/KIKI_ZSH/article/details/127493820
0
投稿
猜你喜欢
- 最近换了家新公司,由于是创业公司,项目基本从零开始搭建。工作几年,也没想过写点什么技术性的东西,今天突然心血来潮,哦当然,我这个人总是特别容
- 用HZHOST实用工具集的服务器安全设置里安装了MSSQL安全配置,现在SQL2000还原不了数据库了,从还原选定设备浏览文件夹时出现&qu
- 有时我们会碰到类似下面这样的 unicode 字符串:u'\xe4\xbd\xa0\xe5\xa5\xbd'这明显不是一个正
- 本人第一次使用vue awesome。踩到的坑确实不少。官网上面的用法写的很简单,按照上面做法基本会遇到如下这个问题轮播第二次之后,首屏会自
- 在登陆界面中,通常,最重要的部分为登陆的Form表。一个非常棒的提升体验的做法是,在载入页面时自动聚焦到第一个提供用户输入的表单框,让用户不
- 许多游戏玩家一定会对游戏中的动态鼠标指针有很深的印象,其实只要一句简单的CSS(层叠样式表),你也能在网页上实现这种效果。首先,你需要一个鼠
- 在网络上看到的数字人整合动网论坛的方法都非常不全,站长们都是抄人家的,也不说明可不可用,提供下载的文件也不能下载.现在我提供一些信息。一、整
- 从某个页面表单中取出信息是ASP编程中常见的问题。但是,遍历通过表单传递的记录会花去多长时间呢?这取决于数据库的大小。简单的GUI界面都可能
- 前言大家都知道,Python自带的datetime库提供了将datetime转为ISO 8610格式的函数,但是对于时间间隔(inteval
- 本文为大家分享了js实现简单选项卡功能的具体代码,供大家参考,具体内容如下首先我们来写HTML代码,构建出整体结构代码如下:<!--导
- 一、MySQL删除外键格式:alter table 表名 drop foreign key 外键名;表名就是有外键存在的那个表。外键名可以通
- 本文实例为大家分享了python多线程同时接受和发的具体代码,供大家参考,具体内容如下'''模仿qq 同时可以发送信
- 在传统的递归中,典型的模式是,你执行第一个递归调用,然后接着调用下一个递归来计算结果。这种方式中途你是得不到计算结果,知道所有的递归调用都返
- 介绍公司以前的一个exe包,我们需要查看里面python源码,但是以前的py源码文件找不到,所以只能反编译,介绍一下反编译的过程。首先准备:
- 我就废话不多说了,大家还是直接看代码吧!def pro_mgr(): """ 获取当前
- 小白尝试写任意文件读取poc我是一个小白,完全不懂Python,但是Python在渗透中往往是一个重要的角色。有一个CSDN百万大佬写了这样
- python是很容易上手的编程语言,但是有些时候使用python编写的程序并不能保证其运行速度(例如:while 和 for),这个时候我们
- 在“Python源码学习笔记:Python万物皆对象”中,我们对Python的对象类型体系有了一定的
- PDO常用方法:PDO::query()主要用于有记录结果返回的操作(PDOStatement),特别是select操作。PDO::exec
- python中有很多字符串连接方式,今天在写代码,顺便总结一下:最原始的字符串连接方式:str1 + str2python 新字符串连接语法