python使用selenium模拟点击网页实现自动导入上传文件功能
Posted robot_sql
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python使用selenium模拟点击网页实现自动导入上传文件功能相关的知识,希望对你有一定的参考价值。
一、环境准备
Python版本:3.4
编辑器:Pycharm
excel文件:导入的excel模板
二、python代码
由于工作需要,需要每天定时导入相关excel文件进入后台数据库,由于导入的逻辑比较复杂,所以决定通过python模拟登陆导入网站,点击相关功能来实现自动导入。
代码如下:
#!/usr/bin/env python
# coding=utf-8
# import time
from selenium import webdriver
import os
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
# import requests
# from selenium.webdriver.common.keys import Keys
# 自动化操作创研系统的线索导入功能
def ui_auto_operation():
# 模拟登陆
# rep = requests.Session()
browser = webdriver.Firefox()
browser.implicitly_wait(10) # 设置隐性等待,等待10S加载出相关控件再执行之后的操作
browser.maximize_window()
browser.get('http://www.*******.com.cn/****/Login.aspx')
# time.sleep(10) # 强制等待一般只用于测试
# browser.refresh()
# 输入用户名
username = browser.find_element_by_xpath('//*[@id="txtUserName"]')
username.clear()
username.send_keys('*******')
print('username input success')
# 输入密码
browser.find_element_by_xpath('//*[@id="txtPassword"]').send_keys('******')
print('password input success')
# # 加载验证码
# yzm = browser.find_element_by_xpath('/html/body/div[2]/div/div[2]/form/dl[3]/dd/input')
# yzm.send_keys(input('输入验证码:'))
# 点击登陆
browser.find_element_by_xpath('//*[@id="btnLogin"]').click()
print('login success')
# cookies = browser.get_cookies()
# for cookie in cookies:
# rep.cookies.set(cookie['name'], cookie['value'])
# 爬取对应网页的数据
browser.current_window_handle
browser.find_element_by_xpath('/html/body/div[2]/div[1]/div[1]/div[8]/div/a/span').click()
# 切换到当前窗口
browser.current_window_handle
# time.sleep(5)
tow_drive = browser.find_element_by_xpath('/html/body/div[2]/div[1]/div[1]/div[8]/ul/li[5]/a')
tow_drive.click()
print('turn success')
browser.current_window_handle
# time.sleep(2)
# 切换到iframe框架里面
browser.switch_to.frame(browser.find_element_by_xpath('//*[@id="mainFrame"]'))
# # 输入框只读属性的修改
# js = 'document.getElementById("Text1").removeAttribute("readonly");'
# browser.execute_script(js)
# # 定位并且输入路径数据
# receiveStart = browser.find_element_by_xpath('//*[@id="Text1"]')
# receiveStart.clear()
# receiveStart.send_keys('C:\\\\fakepath\\\\5096.xls')
# # receiveStart.send_keys(Keys.RETURN)
# 点击上传文件按钮
browser.find_element_by_xpath('//*[@id="btn1"]').click()
# 调用写好的exe实现上传,autoup.exe的建立参考下面的网站
# https://www.cnblogs.com/sunjump/p/7268805.html
os.system("C:\\\\fakepath\\\\autoup.exe")
# time.sleep(5)
load = browser.find_element_by_xpath('//*[@id="btn_lead"]')
load.click()
try:
# 每隔2s就去扫描弹出框是否存在,总时长是60s,存在就继续执行之后代码
WebDriverWait(browser, 60, 2).until(EC.alert_is_present())
# 处理弹出alert框
alert = browser.switch_to.alert
alert.accept()
finally:
browser.close()
# browser.quit()
if __name__ == '__main__':
# @version : 3.4
# @Author : robot_lei
# @Software: PyCharm Community Edition
ui_auto_operation()
三、注意事项
此网站属于内部使用,不用输入验证码就可以实现登陆,所以操作相对简单很多。其中遇到的主要问题:
(1)、iframe框架的切换,也就是加载的网页中有部分代码存在iframe里面,导致页面的代码加载不出来,python无法定位到相关的元素。
(2)、上传的输入框不是直接用的input和参数传入原因,导致不能直接在在上传的文件框输入需要导入的文件路径,需要点击导入按钮,然后选择文件路径,再点击上传按钮才可以上传。
(3)、alert弹出框处理,由于导入数据比较多的时候,时间过长会导致alert弹出框还没弹出,但是代码就开始操作弹出框了,此时肯定无法定位元素,所以需要等待一段时间定时扫描查看来处理弹出框。
(4)、使用SciTE Script Editor编辑程序时需要在file->Encoding里面选择编码,一般是utf-8。
对应代码如下:
;等待5秒钟,让上传窗口出现
WinWait("CLASS:#32770","",5)
;把输入焦点定位到上传输入文本框中,类型为Edit,编号为1,也就是上面获取到内容
ControlFocus("文件上传", "","Edit1")
;在文件名那里,输入需要上传的文件绝对路径
ControlSetText("文件上传", "", "Edit1", 'C:\\fakepath\\5096.xls')
;等待上传时间,单位是毫秒 1秒 = 1000 毫秒,文件大的话需要设置长点
Sleep(5000)
;点击"打开"按钮,也就是上传,完成整个上传过程
ControlClick("文件上传", "","Button1");
以上是关于python使用selenium模拟点击网页实现自动导入上传文件功能的主要内容,如果未能解决你的问题,请参考以下文章
python使用selenium模拟点击网页实现自动导入上传文件功能
使用selenium webdriver+beautifulsoup+跳转frame,实现模拟点击网页下一页按钮,抓取网页数据
Python+selenium 模拟网页点击爬虫交管12123违章数据