9 Nov 2010

python调用selenium模拟浏览器行为


测试python刷新签证结果的脚本时候发现,由于调用win32com模拟ie,为了等待ie的状态更新,使用了无限循环while 1这种语法,面对检测刷新结果本身需要无限刷新的情况下,程序的流程很乱,而且结果好像有不正确的情况.搜到了selenium这个东东,经测试,代码非常清晰,封装成2个函数调用,而且效果也很好.具体代码:

由于代码很简短,一看便知,因此没有注释.
# -*- coding: cp936 -*-
from selenium import selenium
import time
import re
import smtplib

# 查询状态函数,需要修改ref号码,生日参数
def checkResult(sel):
sel.start() # 打开selenium服务,由于要死循环调用,因此后面要关闭
sel.open("/UKG-PassportTracking-PPT/ApplicantTrackStatus.aspx?Data=eQhlWV1635htWhLZVVgaKw==⟨=XlDVhFJC4oE=")
sel.type("txtRefNO", "签证reference号码")
sel.type("txtDat", "生日天")
sel.type("txtMont", "生日月")
sel.type("txtYea", "生日年")
sel.click("cmdSubmit")
sel.wait_for_page_to_load("30000")
s = sel.get_html_source()
reStat = 'id=lblScanStatus>(.+?)'
stat = re.findall(reStat,s)[0]
sel.close() # 关闭ie窗口,否则会不停打开窗口耗尽资源
sel.stop() # 关闭selenium服务
return (stat.find(u'受理当中'),stat)

# 发送邮件代码,需要修改邮箱地址和密码
def sendmail():
# 参数:发送和收到地址
fromaddr = 'xxx@gmail.com'
toaddrs = 'xxx@gmail.com'
msg = '结果出来啦!!!'

# 账户信息:邮箱地址,密码
username = 'xxx@gmail.com'
password = 'xxxxxxx'

# google邮箱smtp服务
server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo()
server.starttls()
server.ehlo()
server.login(username,password)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
print '邮件已发'

def main():
verificationErrors = []
# 参数有多个可选,这里调用iexplore
sel = selenium("localhost", 4444, "*iexplore", "https://www.vfs.org.in/")
while 1:
(ind,st) = checkResult(sel)
if ind==-1:
sendmail()
print '签证结果出来了!'
break
else:
print time.asctime()
print st
time.sleep(600)

if __name__=='__main__': main()

No comments :

Post a Comment