python selenium T3
既然要做自动,就得对得起自动化的这个名字。这一章我们将进一步的增加自动化测试的实用,增加
自动发邮件功能、多线程 和定时任务,让我们的自动化工作真正变得高效而又强大起来。
EG1 :
with open('report.html' , 'r') as f: msg = MIMEText(f.read() , _subtype='html' , _charset='utf-8') msg['Subject'] = Header(subject, 'utf-8') msg['date'] = datetime.now().strftime('%Y-%m-%d %H-%M-%S') smtp = smtplib.SMTP() smtp.connect(smtpserver) smtp.login(username, password) smtp.sendmail(sender,receiver , msg.as_string()) smtp.quit()
EG2:
每个进程都有自己的地址空间,内存,数据栈以及其它记录其运行轨迹的辅助数据。操作系统管理在其上运行的所有进程,并为这些进程公平地分配时间。
线程(有时被称为轻量级进程)跟进程有些相似,不同的是,所有的线程运行在同一个进程中,共享
相同的运行环境。我们可以想像成是在主进程或“主线程”中并行运行的“迷你进程”。
在单线程中顺序执行两个循环。一定要一个循环结束后,另一个才能开始。总时间是各个循环
运行时间之和
thread 提供了低级别的、原始的
线程以及一个简单的锁。threading 基于 Java 的线程模型设计。锁(Lock)和条件变量(Condition)在 Java 中是对象的基本行为(每一个对象都自带了锁和条件变量),而在 Python 中则是独立的对象。
我们应该避免使用 thread 模块,原因是它不支持守护线程。当主线程退出时,所有的子线程不论它
们是否还在工作,都会被强行退出。有时我们并不期望这种行为,这时就引入了守护线程的概念。 threading模块则支持守护线程。join()会等到线程结束,或者在给了 timeout 参数的时候,等到超时为止。join()的另一个比较重
要的方面是它可以完全不用调用。一旦线程启动后,就会一直运行,直到线程的函数结束,退出为止。
multiprocessing 使用类似于 threading 模块的 API ,multiprocessing 提供了本地和远程的并发性,有
效的通过全局解释锁(Global Interceptor Lock, GIL)来使用进程(而不是线程)。由于 GIL 的存在,在 CPU 密集型的程序当中,使用多线程并不能有效地利用多核 CPU 的优势,因为一个解释器在同一时刻只会有一个线程在执行。所以,multiprocessing 模块可以充分的利用硬件的多处理器来进行工作。它支持 Unix 和Windows 系统上的运行。
EG1:
from time import sleep, ctimedef loop0(): print('start loop 0 at:', ctime()) sleep(1) print('loop 0 done at:', ctime())def loop1(): print('start loop 1 at:', ctime()) sleep(1) print('loop 1 done at:', ctime())def main(): print('start:', ctime()) loop0() loop1() print('all end:', ctime())if __name__ == '__main__': main()
EG2:
import threadingfrom time import sleepfrom datetime import datetimeloops = [2, 4]def loop(nloop , nsec): print('start loop ' , nloop , ' at : ' , datetime.now()) sleep(nsec) print('end loop ' , nloop , ' at : ' , datetime.now())def main(): print('start main ' , datetime.now()) threads = [] nloops = range(len(loops)) for i in nloops : t = threading.Thread(target=loop , args=(i , loops[i])) threads.append(t) for i in nloops: threads[i].start() # 开启线程 for i in nloops: threads[i].join() # 等待线程终止 print('end main ', datetime.now())if __name__ == '__main__': main()
EG3:
import threadingfrom time import sleepfrom datetime import datetimeloops = [4, 2]format_date = '%Y-%m-%d-%H-%M-%S'class ThreadFunc(object): def __init__(self, func, args, name): self.name = name self.func = func self.args = args def __call__(self): apply(self.func , self.args)def loop(nloop , nsec): print('start loop ' , nloop , ' at : ' , datetime.now().strftime(format_date)) sleep(nsec) print('end loop ' , nloop , ' at : ' , datetime.now().strftime(format_date))def main(): print('start main ' , datetime.now()) threads = [] nloops = range(len(loops)) for i in nloops: t = threading.Thread(target=ThreadFunc(loop , (i, loops[i]) , loop.__name__)) threads.append(t) for i in nloops: threads[i].start() for i in nloops: threads[i].join() print('end main ' , datetime.now().strftime(format_date))if __name__ == '__main__': main()
EG4: