APP下载

基于Python+Selenium的高校毕业设计成果自动上传系统

2022-12-17丁烨敏

现代计算机 2022年18期
关键词:毕业设计页面界面

丁烨敏

(湖南工业职业技术学院电气工程学院,长沙 410208)

0 引言

学生的毕业设计成果的管理是一项繁琐的工作,其中就包含毕业设计成果的保存。目前大部分高校都要求学生将毕业设计成果提交保存到指定的管理平台。提交上传毕业设计成果的工作,可能由学生自己,或者毕业设计指导老师完成,而且基本上都是通过手动完成。只要是人为的操作,就会出现问题。为了节省时间,提高毕业设计成果管理工作的效率,使用应用程序实现毕业设计成果自动上传提交非常有必要。

1 开发技术和环境

学生毕业设计成果管理平台一般都是通过Web进行交互操作。因为管理平台的API不一定开放给一般用户使用。所以,要实现自动上传功能,必须考虑到和毕业设计成果管理平台Web界面的交互操作。

目前能够实现与Web界面自动交互的工具有Selenium[1]、QTP[2]、Watir[3]、Robot Framework[4]等。QTP是商业版本不免费,使用成本太高。Watir使用Ruby语言进行脚本开发,对于没有学过Ruby的用户而言可能存在一些困难。Robot Framework功能很强大,但是更适用于进行自动化测试。Selenium是一个强大的Web自动化工具,使用灵活并且支持各种语言、多种操作系统和浏览器,并且是开源的。综合考虑,确定使用Selenium实现Web自动交互。

登录管理平台需要获取学生的相关信息,例如学生的账户、密码、班级学号、课题名称等,这些数据可能保存在excel表格中。因此,读取excel文件数据也成为毕业设计成果上传提交的前提。Python提供了强大的文件读取和数据处理功能,并且也提供了Selenium程序包。因此最终确认使用Python+Selenium的开发技术来实现毕业设计成果自动上传功能。

开发环境方面,操作系统使用的是Windows 10。Python选用的版本是3.7.3。Python环境安装完成后,使用pip install selenium命令在线安装selenium最新版本,安装成功后可以使用pip show selenium命令查看安装的selenium版本。集成开发环境使用PyCharm。

2 需求描述

学生毕业设计成果自动提交需要实现如下需求:

(1)自动读取本地excel文件中保存的学生毕业设计相关信息,包括学生姓名、班级学号、毕业设计课题名称、管理平台用户名、管理平台密码等。

(2)自动打开管理平台网页,使用用户名和密码自动进行登录。

(3)自动在管理平台新建毕业设计课题任务。

(4)自动提交毕业设计成果并保存。

(5)自动获取毕业设计成果上传后的链接网址,并保存到本地excel文件中。

3 功能实现

通过上面功能描述,可以将程序分为两大功能模块:excel文件处理和Web自动交互。excel文件处理功能模块主要使用pandas程序包实现,可以使用pip install pandas安装pandas。使用pandas读写excel文件的内容不做详细描述,在这里主要介绍使用Selenium如何实现自动和Web进行交互。

实现和Web自动交互,就需要打开Web界面,找到Web界面上的元素,模拟人为操作,例如键盘输入、鼠标点击、文件选择等功能。

3.1 Selenium打开网页

Selenium支持多种浏览器,本程序使用的是谷歌浏览器。在配置完浏览器后,需要使用Selenium WebDriver加载要打开管理平台Web对应的链接地址(URL)。示例代码如下:

from selenium import webdriver

driver=webdriver.Chrome()

driver.get(URL)

3.2 Selenium查找Web页面节点元素

Selenium提供了多种查找Web页面节点元素的 方 法[5],具 体包 括:find_element_by_id、find_element_by_name、find_element_by_xpath、find_element_by_link_text、find_element_by_partial_link_text、find_element_by_tag_name、find_element_by_class_name、find_element_by_css_selector。需要注意的是,这些方法的返回值是list列表类型(结果保存在list列表中)。查找Web页面元素的示例如下。

使用手机号作为登录名进行登录时,输入手机号码的编辑框HTML描述如下:

<input type="text"class="ipt-tel"placeholder="手机号"id="phone"maxlength="50">

可以使用element=driver.find_elements_by_id("phone")查找到界面上的该编辑框。返回值element表示查找结果对应的list列表。

登录按钮的HTML描述如下:

<input type="button"value="登录"class="loginSub"onclick="goPassport2Login();">

可以使用element=driver.find_elements_by_class_name("loginSub")查找到界面上的该登录按钮。

当页面的元素既没有id属性也没有name属性时,可以使用xpath来查找该元素。xpath表示xml元素的路径,它完全可以替代其他元素(id、name、class_name、tag_name等)定位方式。其HTML描述如下:

<html>

<body>

<form id="inputForm"name="inputForm">

<input type="text"name="subject"id="subject"value=""placeholder="输入专题名称">

<input type="text"name="author"id="author"value=""placeholder="输入作者名">

</form>

</body>

<html>

查找form表单元素,可以使用如下方法:element=driver.find_elements_by_xpath("/html/body/form")。该种方法使用form表单元素在HTML文件中完整路径位置来进行定位查找。

当然也可以使用element=driver.find_elements_by_xpath("//*[@id=’inputForm’]")。该种方法是通过相对定位来查找,//表示从匹配选择的当前节点下继续查找;*通配符,表示任意元素节点。整个语句表示HTML文件当前位置的任意元素节点下id名为inputForm的元素。

除了使用*通配符,在xpath中还可以使用文本定位、模糊定位等。例如element=driver.find_elements_by_xpath("//*//input[starts-with(@id,'sub')]"),表示在HTML文件当前位置的任意元素节点下找到id名以sub开头的节点元素。

3.3 Selenium模拟用户操作

找到页面节点元素后,需要模拟用户的操作。例如键盘输入数据、点击等。上文使用element=driver.find_elements_by_id("phone")找到输入手机号码的编辑框,可以使用element[0].send_keys(phoneNumber)模拟用户在该编辑框中输入手机号码。注意这里使用的是element[0],因为find_element_by_id的返回结果是list列表,需要指定取出该列表中指定位置的元素。

同样,上文使用element=driver.find_elements_by_class_name("loginSub")找到界面上的登录按钮后,可以使用element[0].click(),或者element[0].send_keys(Keys.ENTER),模拟用户点击该按钮。其中Keys.ENTER表示回车键。

3.4 Selenium切换窗口

当Web界面进行跳转打开新的Web界面时,Selenium需要切换窗口才能在新的Web页面进行元素节点查找[6]。具体如下:

driver.switch_to.window(driver.window_handles[-1])

语句中window_handles表示Web窗口界面句柄列表,-1表示切换到最后一个界面,也就是最新打开的界面。如果目前已经打开了三个Web窗口界面,上面的语句中将-1改为-2,即可跳转到第二个Web窗口界面进行操作。也可以通过first_win=driver.current_window_handle获取当前Web窗口界面的handle句柄。后续如果需要切换回该Web窗口界面时,执行driver.switch_to.window(first_win)即可。

当然,HTML中也有iframe标签,表示内联框架,可以理解为在一个HTML中内嵌一个子HTML。Selenium不能直接在父HTML中查找到iframe中定义的元素节点,也需要先进行切换[7],具体方法如下:

driver.switch_to.frame(frame_name)

其中,frame_name表示iframe的名称。执行上述语句后即可跳转到iframe中操作节点元素。当iframe中操作结束,需要返回到之前的Web窗口界面时,需要执行如下语句。

driver.switch_to.default_content()

3.5 文件上传

当在Web界面中点击文件上传时,首先需要用户选择本地文件。Python中如何实现自动选择本地文件呢?此时需要借助pywin32程序包。pywin32程序包包含了Windows系统的Win32 API,能创建和使用COM对象和图形窗口界面。可以使用pip install pywin32命令进行安装。

在使用Selenium Webdriver打开Windows文件选择窗口后,调用函数win32_select_file()可以实现Windows本地文件选择。

import win32gui

import win32con

def win32_select_file(path):

dialog=win32gui.FindWindow("#32770","打开")#"#32770"表示弹出框的窗口类名

comboBoxEX32=win32gui.FindWindowEx(dialog,0,"ComboBoxEx32",None)

comboBox=win32gui.FindWindowEx(comboBox-EX32,0,"ComboBox",None)

editBox=win32gui.FindWindowEx(comboBox,0,"Edit",None)

button=win32gui.FindWindowEx(dialog,0,"Button","打开(&0)")

win32gui.SendMessage(editBox,win32con.WM_SETTEXT,None,path)

win32gui.SendMessage(dialog,win32con.WM_COMMAND,1,button)

其中win32_select_file()的参数path表示要上传的本地文件的完整路径。执行win32_select_file()函数后,即设置了需要上传的文件,接下来依旧使用Selenium模拟人为操作,例如鼠标点击等,触发文件上传。

3.6 保存链接地址

所有上传文件操作、保存操作结束后,需要保存毕业设计成果上传保存后的Web页面链接。在Selenium中可以使用如下语句获取当前Web页面链接地址。

retUrl=driver.current_url

retUrl即保存当前Web页面的链接地址。如果毕业设计成果上传后保存的Web页面链接地址并非当前Web界面的链接地址,那么可以结合Selenium切换窗口的操作,最终获取到毕业设计成果上传后保存的Web页面链接地址。

4 结语

本文使用Python+Selenium,实现对高校学生的毕业设计成果自动提交保存到管理平台功能,测试结果表明,Python+Selenium实现的程序代码简洁凝练,通俗易懂,便于维护,可以大大减少学生、老师重复性的繁琐工作,并且能够保证提交的质量。对于有类似需求的工作场景,也具有非常高的参考价值。

猜你喜欢

毕业设计页面界面
刷新生活的页面
不同截面类型钢管RPC界面粘结性能对比研究
微重力下两相控温型储液器内气液界面仿真分析
答案
让Word同时拥有横向页和纵向页
国企党委前置研究的“四个界面”
高等职业院校汽车检测与维修专业毕业设计探究
基于应用型人才培养模式下的毕业设计改革的思考
——以四川文化艺术学院为例
电子商务专业毕业设计实施与探索