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");



已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页