记录第一次Selenium实战:全自动“申请出校”程序设计

一、背景

        2022年5月23日,结束了漫长的封校期,“备案制”正式回归!作为学生党,又可以在当日返校的前提下走出校门,看看外面的景色了。“备案制”虽好,仍需手动填写申请信息,这些信息都是固定的,而且从提交申请,到获得门禁许可,还有五分钟左右的延迟。作为懒狗一个,如果这些千篇一律的动作(登录、填报信息、申请)能交给计算机处理该有多好,它就是干这个的料!为了更好地偷懒学以致用,开始研究自动申请出校的程序。


二、环境搭建

        本程序需要导入的库有:selenium,time等。使用的浏览器为Google Chrome,Python版本为3.7.4。

1、安装selenium

        命令行输入“pip install selenium”即可。

2、安装webdriver

        建议参考该教程:

Chromedriver安装教程(简洁版)https://blog.csdn.net/weixin_45109684/article/details/117650036


三、实现思路

        实际上,“申请出校”可以归纳为以下动作:打开登录网页,填写学号、密码,登录;进入服务大厅,点击“学生出入校园信息填报”;完善信息;申请。

        因此,使用selenium提供的定位网页元素功能,对元素进行相应的操作,即可实现自动“申请出校”!

Python脚本Selenium及页面Web元素定位详解https://www.jb51.net/article/225939.htm#_lab2_1_1


四、代码展示

1、导入模块

from selenium import webdriver
import time

2、实例化

    chromedriver = r'C:\Program Files\Google\Chrome\Application\chromedriver.exe'
    browser = webdriver.Chrome(chromedriver)
 
    url = "登录网站"
    browser.get(url)
    time.sleep(5)

        url即为登录网站,此时browser打开了登录网站,并等待5秒。等待时间受限于网络速度,这么做是为了确保网页加载完毕,否则将会报错。

 3、定位元素

        在登录网站按下F12,右侧出现调试窗口,选择箭头位置的“检查”功能后,将鼠标移到网页元素即可进行定位。 

         首先定位填写学号的文本框,将鼠标移至文本框区域,右侧调试窗口出现文本框对应的代码。

         有了对应的代码,即可进行元素定位,这里选择了css_selector方式,使用“id”属性进行定位。密码文本框和登录按钮的定位也是如此。定位成功后,使用send.keys()方法填入学号与密码;使用click()方法点击“账号登录”按钮。

    text = browser.find_element_by_css_selector("input[id='un']") #学号
    text.send_keys(ID)
    password = browser.find_element_by_css_selector("input[id='pd']") #密码
    password.send_keys(passnumber)
    submit = browser.find_element_by_css_selector("input[id='index_login_btn']") #登录
    submit.click()
    time.sleep(5)

        登录成功后进入服务大厅。用上文介绍的办法定位“学生出入校园信息填报”按钮,点击它,弹出填写表单的新窗口。

         点击后将弹出新的网页,这里是我遇到的第一个坑。我们应该在新的网页中继续操作,否则将无法定位元素。这里使用了switch_to方法,将浏览器切换到最新弹出的窗口。

    cls = browser.window_handles
    browser.switch_to.window(cls[1]) #切换到最新弹出的窗口
    time.sleep(5)

        在新窗口中,出现了“注意事项”小窗口,继续定位“我已阅读并确认”按钮,点击它。 

         这里使用了xpath的定位方法。找到按钮对应的代码后,右键出现菜单,依次选择“复制”-“复制(完整)XPath”,即可获取元素的xpath。

        这里复制了完整xpath。定位成功,点击按钮。

    confirm1 = browser.find_element_by_xpath("/html/body/div[2]/div/div/div/div[3]/button") 
    confirm1.click()
    time.sleep(5)

        这里我遇到了第二个坑。我想勾选“外出类型”中的“临时外出”,按照上面的方法,获取到了“临时外出”按钮的xpath,但运行程序时显示无法定位到该元素。查找网上的各种解决办法后,终于了解了无法定位的原因:由于Frame/Iframe导致的无法定位元素。

  首先要理解下frame的实质,frame中实际上是嵌入了另一个页面,而webdriver每次只能在一个页面识别,因此需要先定位到相应的frame,对那个页面里的元素进行定位。就具体问题而言,我现在处于“新窗口”中,而填写的表单是一个frame。所以,为了定位到表单内的元素,首先应该进入表单这个frame。

        在调试窗口中按下“Ctrl+F”,搜索“frame”或“iframe”,找到与整个表单对应的代码部分。

         找到对应的id,使用switch_to.frame()方法进入该frame。进入后就能正确定位到“临时外出”按钮,然后点击它。

    browser.switch_to.frame('formIframe')
    type_of_going_out = browser.find_element_by_xpath("//*[@id='wclx_vant']/div/div[1]/span") #临时外出
    type_of_going_out.click()

        表单内的其他信息的完善也是如此,文本框用send_keys(),按钮用click()方法即可,在此不做赘述。

    reason_for_going_out = browser.find_element_by_xpath("/html/body/div[1]/div[11]/div[2]/div/div/div/div[6]/span") #外出事由
    reason_for_going_out.click()

    reason = browser.find_element_by_xpath("//*[@id='jtsyms']") #外出原因
    reason.send_keys('吃饭')

    destination = browser.find_element_by_xpath("//*[@id='wcmdd_vant']/div/div[1]/span") #目的地是否为本市
    destination.click()

    expected_leaving_date = browser.find_element_by_css_selector("input[id='cxrq']") #出校日期
    expected_leaving_date.click()

        在选择出校日期时,遇到了第三个坑。点击“出校日期”后,弹出类似月历的小窗口,无法定位到“今天”按钮。

        实际上,这个小窗口也是一个独立的frame,与表单同级。由于现在处在表单中,首先要回到表单的父frame,及“新窗口”,然后进入月历frame,定位“今天”按钮,点击它。

    browser.switch_to.parent_frame()
    browser.switch_to.frame(browser.find_element_by_xpath("//*[@id='wdatapicker']/iframe")) 
    time.sleep(1)
    date1 = browser.find_element_by_xpath("//*[@id='dpTodayInput']") #今天 
    date1.click()

        点击后,遇到第四个坑。网页弹出一个提示,并且无法使用“检查”功能定位提示的“确定”按钮。定位不到可还行,卡在这里了。经过查找资料,终于弄清楚了原因:该提示是一个alert(警告信息)。

        Alert的特点是无法被检查到,只有“确认”一个按钮。还好selenium早有准备,已经做好了对策。

         使用switch_to.alert方法切换到alert,使用accept()方法即可接收(点击“确定”按钮)。

    alert = browser.switch_to.alert #第一次弹窗:出校时间必须小于返校时间。 
    print(alert.text) #打印弹出框提示信息   
    alert.accept() #点击确定按钮

        故技重施,将剩下的其他信息完善就可以提交申请啦!最后记得关闭浏览器,释放内存。

    browser.quit()

五、总结与展望

        通过selenium和webdriver,使用程序模拟人工进行“点击”“填写信息”等操作,从而实现全自动“申请出校”。也许填写的信息不尽相同,但方法是一致的,有针对性地修改即可。总的来说,该程序是“定位元素并对其进行操作”的多次叠加。该程序思路也适用于“每日体温填报”等填报表单事件的自动化。

        计划于其他程序相结合,如每日固定时间运行一次,真正实现“出校自由”!每日定时执行程序的实现思路敬请期待。


感谢你读到最后,希望对你有所帮助!

个人理解,如有不足之处,欢迎批评指正!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鲨鱼辣椒最帅

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

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

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

打赏作者

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

抵扣说明:

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

余额充值