Python实现网页自动点击及附件上传


前言

应用背景:网页重复性点击处理一些办公内容时,我们考虑采用python语言针对性编程,根据处理网页重复性的工作内容设计编程,实现办公自动化,例如:数量多的工单处理,工单审核等等。 外部模块:selenium+pandas+pyautogui+pyperclip

一、selenium、pandas、pyautogui、pyperclip介绍

1.Selenium (WEB自动化工具): Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。
2.Pandas(python的一个数据分析包):是,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数据包开发的PyData开发team继续开发和维护,属于PyData项目的一部分。Pandas最初被作为金融数据分析工具而开发出来,因此,pandas为时间序列分析提供了很好的支持。 Pandas的名称来自于面板数据(panel data)和python数据分析(data analysis)。panel data是经济学中关于多维数据集的一个术语,在Pandas中也提供了panel的数据类型。
3.PyAutoGUI(GUI自动化工具): 其目的是可以用程序自动控制鼠标和键盘操作,多平台支持(Windows,OS X,Linux)。
PyAutoGUI特点:
·移动鼠标,在其他应用程序的窗口中单击或键入。
·向应用程序发送击键(例如,填写表格)。
·以屏幕截图为例,并给出图像(例如,按钮或复选框),请在屏幕上找到它。
·定位应用程序的窗口,并移动、重新大小、最大化、最小化或关闭它(仅限 Windows,当前)
·在GUI自动化脚本运行期间显示用于用户互动的消息框。

4.Pyperclip (复制粘贴工具): 用 pyperclip 模块拷贝粘贴字符串
pyperclip 模块有 copy() 和 paste() 函数, 可以向计算机的剪贴板发送文本, 或从
它接收文本。将程序的输出发送到剪贴板, 使它很容易粘贴到邮件、文字处理程序
或其他软件中。

二、使用步骤

1.工具下载及安装

pip install Selenium
pip install Pandas
pip install PyAutoGUI
pip install Pyperclip
下载对应google浏览器版本的chromedriver.exe
下载地址: http://npm.taobao.org/mirrors/chromedriver/

2.导入库

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
import pandas as pd
import pyautogui
import pyperclip

3.设计dianji函数

def dianji(a,b):  #单次点击函数 设置坐标
	pyautogui.moveTo(x=a, y=b, duration=0.6, tween=pyautogui.easeInOutQuad)
	pyautogui.mouseDown(x=a, y=b, button='left')
	pyautogui.mouseUp(x=a, y=b, button='left')

4.设计main函数

def main():
	# 保护措施,避免失控
	pyautogui.FAILSAFE = True
	# 为所有的PyAutoGUI函数增加延迟。默认延迟时间是0.1秒。
	pyautogui.PAUSE = 0.4

	driver = webdriver.Chrome(r'./chromedriver.exe')
	driver.maximize_window()
	driver.get('http://www.address.com/index') # 网址
	#输入账号密码
	time.sleep(3)
	driver.find_element_by_xpath('/html/body/div/div[2]/div/div[2]/div[2]/div[1]/input').send_keys('username')
	time.sleep(0.8)
	driver.find_element_by_xpath('//*[@id="loginPwd"]').send_keys('password')
	time.sleep(0.8)
	driver.find_element_by_xpath('//*[@id="loginCheck"]').send_keys('')
	qr = input('请输入验证码且确认!y or n:')

	if qr == 'y' or qr == 'Y':
		time.sleep(10)
		# cookies = driver.get_cookies()
		# print(cookies)
		print('---开始运行---')
		#外包优化管理
		driver.find_element_by_xpath('//*[@id="indexMenuBg"]/div[9]/a').click()
		time.sleep(0.5)
		#日常优化流程
		driver.find_element_by_xpath('//*[@id="indexMain"]/div[1]/div[2]/div[3]/div[1]/div/div/div[9]/ul/li/div[4]/ul/li/div[1]/a').click()
		time.sleep(8)

		df = pd.read_excel('info-12-0623.xlsx',sheet_name = 0)

		#搜索工单
		driver.find_element_by_id('wfTaskBtnSearch_101').click()
		time.sleep(0.5)


		x = 102
		for i in range(df.shape[0]):
			Hangdata = df.iloc[i].tolist()  # 用列表操作 其实Series也可以操作
			a = Hangdata[0]  # 单号
			b = Hangdata[1]  # filename
			c = Hangdata[2]  # WD_filename
			d = Hangdata[3]  # 回复
				
			
			#工单号填入
			driver.find_element_by_id('nop_fieldc_101_1003').clear()
			driver.find_element_by_id('nop_fieldc_101_1003').send_keys(a)
			time.sleep(0.5)
			driver.find_element_by_id('wfTaskBtnQuery_101').click()
			time.sleep(5)
			#进入工单
			ActionChains(driver).double_click(driver.find_element_by_xpath('//*[@id="gridwfTaskGrid_101"]/div[2]/table/tbody/tr[1]')).perform()
			time.sleep(3)


			#分析定位问题类型
			driver.find_element_by_xpath('//*[@id="nop_fieldd_' +str(x)+ '_87"]').click()
			driver.find_element_by_xpath('//*[@id="wfDetailContents_' +str(x)+ '"]/div[3]/div[2]/div/div/div/div[2]/div[1]/ul/li[3]').click()
			time.sleep(0.5)
			#确定
			driver.find_element_by_xpath('//*[@id="wfDetailContents_'+str(x)+'"]/div[3]/div[2]/div/div/div/div[2]/div[2]/button[1]').click()
			time.sleep(0.5)

			#是否现场测试
			driver.find_element_by_xpath('//*[@id="nop_fieldd_'+str(x)+'_55"]').click()
			driver.find_element_by_xpath('//*[@id="wfDetailContents_'+str(x)+'"]/div[3]/div[3]/div/div/div/div[2]/div/ul/li[2]/span').click()
			time.sleep(0.5)

			#是否为疑难问题
			driver.find_element_by_xpath('//*[@id="nop_fieldd_'+str(x)+'_23"]').click()
			driver.find_element_by_xpath('//*[@id="wfDetailContents_'+str(x)+'"]/div[3]/div[5]/div/div/div/div[2]/div/ul/li[2]/span').click()
			time.sleep(0.5)

			#处理方案分类
			driver.find_element_by_xpath('//*[@id="nop_fieldd_'+str(x)+'_25"]').click()
			driver.find_element_by_xpath('//*[@id="wfDetailContents_'+str(x)+'"]/div[3]/div[8]/div/div/div/div[2]/div/ul/li[1]/span').click()
			time.sleep(0.5)

			#参数调整类型
			driver.find_element_by_xpath('//*[@id="nop_fieldd_'+str(x)+'_27"]').click()
			time.sleep(0.5)

			#小区级
			driver.find_element_by_xpath('//*[@id="wfDetailContents_'+str(x)+'"]/div[3]/div[10]/div/div/div/div[2]/div[1]/ul/li[1]/label').click()
			time.sleep(0.5)
			#确定
			driver.find_element_by_xpath('//*[@id="wfDetailContents_'+str(x)+'"]/div[3]/div[10]/div/div/div/div[2]/div[2]/button[1]').click()

			#下拉
			pyautogui.mouseDown(x=1650, y=954, button='left')
			time.sleep(1)
			pyautogui.mouseUp(x=1650, y=954, button='left')

			dianji(1460,559) # EXCEL导入
			dianji(1155,433)

			#复制路径粘贴上传
			pyperclip.copy(b)
			time.sleep(0.8)
			pyautogui.hotkey('ctrl','v')
			time.sleep(0.8)
			pyautogui.click(736,602,duration=0.5,tween=pyautogui.easeInOutQuad)
			time.sleep(0.8)
			dianji(1224,430)
			time.sleep(8)
			dianji(1347,392)

			#查看
			dianji(790,883) # 查看
			dianji(647,446) # 上传
			pyperclip.copy(c)
			time.sleep(0.8)
			pyautogui.hotkey('ctrl','v')
			time.sleep(0.8)
			pyautogui.click(736,602,duration=0.5,tween=pyautogui.easeInOutQuad)
			time.sleep(3)
			dianji(1195,736)

			pyperclip.copy(d)
			pyautogui.click(x=1100, y=885, clicks=2, interval=0.2, button='left', duration=0.5,tween=pyautogui.easeInOutQuad)  # 选择并粘贴回复1
			pyautogui.hotkey('ctrl','v')
			time.sleep(0.5)

			#提交
			driver.find_element_by_xpath('//*[@id="wfDetailWrapperTab_'+str(x)+'"]/div[1]/div[1]/button[1]').click()
			time.sleep(17)

			x = x+2

	else:
		print('你选择了关闭Webdriver,3秒后关闭!')
		time.sleep(3)
		driver.quit()
		

	print('工单已回复完成,10秒后关闭webdriver!')
	time.sleep(10)
	driver.quit()

代码说明
1.xpath获取说明例子:
driver.find_element_by_xpath(’/html/body/div/div[2]/div/div[2]/div[2]/div[1]/input’).send_keys(‘username’)
其中xpath:/html/body/div/div[2]/div/div[2]/div[2]/div[1]/input
获取方式:浏览器页面处F12选取内容->右键复制xpath
在这里插入图片描述
复制id同理。
2.xpath动态定位例子:
driver.find_element_by_xpath(’//*[@id=“wfDetailContents_’+str(x)+’”]/div[3]/div[10]/div/div/div/div[2]/div[2]/button[1]’).click()
注意 +str(x)+ 为之前设置的x,webdriver中网页每次进入下一工单会自动+2,所以我们也相应+2
3.pandas读取表格数据模板
在这里插入图片描述

5.函数入口:if name == ‘main

if __name__ == '__main__':
	main()

总结

传入附件的时候,定位了网页xpath可以点击打开,之后需要配合pyautogui模块,实现网页外部点击上传,此处自行设置坐标点,坐标点获取方式参考微信截图ALT+A,查看坐标点。
本小程序实现了自动回复工单的便捷,目前存在缺点就是不能后台运行,这就涉及附件上传时会跳出网页,从而无法元素定位。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ccplayer0722

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值