无头模式添加,可以让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文件

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'
	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的服务

到此这篇关于python selenium参数详解和实现案例的文章就介绍到这了,更多相关python selenium参数内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

python selenium参数详解和实现案例的更多相关文章

  1. 适用于iOS和Android设备的自动验收测试

    我正在开展一个网络项目,很明显,进行一些Selenium类型的自动验收测试会非常有帮助.但该项目是移动/手持设备的网站,而非Selenium支持的桌面浏览器.谷歌搜索一下,发现iOS为Frank,Android为Robotium.这些是使用的两种工具吗?或者有什么好的或更好的东西可能允许我使用Android和iOS的一个工具?不确定这对于移动设备上的Web测试有何用处.

  2. XCode 3.2 Ruby和Python模板

    在xcode3.2下,我的ObjectiveCPython/Ruby项目仍然可以打开更新和编译,但是你无法创建新项目.鉴于xcode3.2中缺少ruby和python的所有痕迹(即创建项目并添加新的ruby/python文件),是否有一种简单的方法可以再次安装模板?我发现了一些关于将它们复制到某个文件夹的信息,但我似乎无法让它工作,我怀疑文件夹的位置已经改变为3.2.解决方法3.2中的应用程序模板

  3. Swift基本使用-函数和闭包(三)

    声明函数和其他脚本语言有相似的地方,比较明显的地方是声明函数的关键字swift也出现了Python中的组元,可以通过一个组元返回多个值。传递可变参数,函数以数组的形式获取参数swift中函数可以嵌套,被嵌套的函数可以访问外部函数的变量。可以通过函数的潜逃来重构过长或者太复杂的函数。

  4. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  5. Swift、Go、Julia与R能否挑战 Python 的王者地位

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  6. 红薯因 Swift 重写开源中国失败,貌似欲改用 Python

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  7. 你没看错:Swift可以直接调用Python函数库

    上周Perfect又推出了新一轮服务器端Swift增强函数库:Perfect-Python。对,你没看错,在服务器端Swift其实可以轻松从其他语种的函数库中直接拿来调用,不需要修改任何内容。以如下python脚本为例:Perfect-Python可以用下列方法封装并调用以上函数,您所需要注意的仅仅是其函数名称以及参数。

  8. Swift中的列表解析

    在Swift中完成这个的最简单的方法是什么?我在寻找类似的东西:从Swift2.x开始,有一些与你的Python样式列表解析相当的东西。(在这个意义上,它更像是Python的xrange。如果你想保持集合懒惰一路通过,只是这样说:与Python中的列表解析语法不同,Swift中的这些操作遵循与其他操作相同的语法。

  9. swift抛出终端的python错误

    每当我尝试启动与python相关的swift时,我都会收到错误.我该如何解决?

  10. 在Android上用Java嵌入Python

    解决方法看看this,它适用于J2SE,你可以尝试在Android上运行.

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部