python与selenium_项目篇_项目实战、代码优化、项目重构

python与selenium_项目篇_项目实战、代码优化、项目重构

2023年7月9日发(作者:)

python与selenium_项⽬篇_项⽬实战、代码优化、项⽬重构实战只想说⼀句:那就是结合你现在所在的项⽬,去写覆盖基本功能的⽤例吧。碰到⼀个问题,解决⼀个问题,坚持不懈,你终究完成。背景:代码是携程⽹预定票的过程。(1)⽂件⽬录,各⽬录代码(2)代码优化、重构,代码层次框架介绍、(3)异常处理、⽇志处理、智能等待(1)请看代码:基础代码层# coding=utf-8from datetime import datetime,date,timedeltafrom selenium import webdriverimport logging,os,xlrd,xlwtimport urllib3#

以下为driver设置和打开携程⽕车票⽹站# driver = ()'''函数return_driver()的功能是返回driver对象'''def return_driver(): return driver'''函数open_base_site(url)的功能是打开携程⽕车票⾸页⾯'''def open_base_site(url): (url)'''函数date_n(n)将返回n天后的⽇期'''def date_n(n): return str((() + timedelta(days = +int(n))).strftime("%Y-%m-%d"))'''函数id将返回按照id属性来定位元素的语句'''def id(element): return _element_by_id(element)'''函数css将返回css selector⽅式来定位元素的语句'''def css(element): return _element_by_css_selector(element)'''函数xpath将返回xpath⽅式来定位元素的语句'''def xpath(element): return _element_by_xpath(element)'''函数js通过selenium来执⾏javascript语句'''def js(element):def js(element): e_script(f"mentById(f'{element}').removeAttribute('readonly')")'''函数log()定义了⽇志的输出格式'''def log(str): #

⽇志基础配置 onfig( level=, #

定义了⽇志的输出级别 datefmt='%a,%d,%b,%Y,%H:%M:%S', #

定义了⽇志输出的时间格式 filename='D:ui_', #

定义了⽇志输出路径⽂件 filemode='a', #⽇志以追加的形式进⼊ format='%(asctime)s%(filename)s%(levelname)s%(message)s' #

定义了⽇志的输出形式 ) #

定义streamhandler格式的⽇志 console = Handler() #

设置⽇志格式 matter() matter(ter('%(name)-12s:%(levelname)-8s %(message)s')) #

给⽇志添加定义后的handler ger('').addHandler(console) (str)'''函数read_excel是输出第⼏列的内容,如果不给cloumn的值,默认是以列表的形式输出所有内容filename:⽂件路径⼀直到⽂件index:索引值第⼏页cloumn:第⼏列'''def read_excel(filename,index,cloumn): #

打开excel⽂件,filename是绝对路径或者相对路径下的⽂件 xls = _workbook(filename) #

打开第⼏个sheet页 sheet = _by_index(index) # print()

⾏ # print()

列 #

内容以字典的形式输出,不给cloum值,默认是输出所有表哥的所有内容 dic={} for j in range(): date=[] for i in range(): (_values(i)[j]) dic[j]=date return dicif __name__ == "__main__": (,"我是dbug级别的") (,"我是info级别的") (G,"我是warning级别的") (,"我是error级别的") (AL,"我是critical级别的")业务代码层search_'''此页⾯的功能是测试⽕车票查询的页⾯元素'''from _chains import ActionChainsfrom functions import date_n,id,css,xpath,js,return_driver,open_base_sitefrom selenium import webdriverimport time'''函数名:search_tickets参数: from_station:出发站 to_station:到达站 n:是⼀个数字,如1表⽰选择明天的车票,2表⽰选择后天的车票'''def search_tickets(from_station,to_station,n): driver = return_driver() open_base_site('/') ze_window() itly_wait(10) # from_station = '上海' from_station = from_station # to_station = '杭州' to_station = to_station #

以下为tommorrow变量 tomorrow = date_n(n) #

以下为定位出发城市和到达城市的页⾯元素,设置其值为以上定义值 css('[placeholder="出发城市"]').send_keys(from_station) id("arriveCityName").send_keys(to_station) #

移除出发时间的“readonly”属性 js("date0bj") (2) #

清除出发时间的默认值 id('dateObj').clear() (2) #

以下定位为搜索车次⽇期 id('dateObj').send_keys(tomorrow) #

以下步骤是为了解决⽇期控件弹出框在输⼊⽇期后⽆法消失的问题,以防影响测试的进⾏,原理是⿏标点击空⽩处 ActionChains(driver).move_by_offset(0,0).click().perform() #

单击“车次搜索”按钮 id('searchbtn').click()#

实例化类,run才有结果if __name__ == '__main__': search_tickets("上海","杭州",1)测试代码层test_booking_rt timefrom functions import date_n,id,css,xpath,js,return_driver,open_base_sitefrom search_tickets import search_tickets#

搜索⽹站⽕车票列表search_tickets("上海","杭州",1)driver = return_driver()(2)#

点击预订按钮xpath("/html/body/div[7]/div/div[5]/div[3]/div/div[1]/div[6]/div[1]/a").click()#

输⼊乘客姓名css('[placeholder="姓名,请与所持证件上的⼀致"]').send_keys("⼩张")(2)代码优化、重构代码优化有2点:1、减少代码量提⾼复⽤率、提⾼健壮性(⼤数据情况下)、可读性、扩展性2、提⾼代码可读性,代码重构可以⽤定义函数来实现。如:# coding=utf-8from selenium import webdriverimport timefrom import Keys#

定义函数部分,减少代码量的且提⾼复⽤率,如果定义函数的部分必须放在测试代码前⾯。def id(element): return _element_by_id(element)def css(element): return _element_by_css_selector(element)def xpath(element): return _element_by_xpath(element)def js(element): return e_script("mentById(" + "'" + element + "'" + ").removeAttribute('readonly')")driver = ()("/")ze_window()#

百度⽹站的id值id("kw").click()css([adsads="sdfs"]).click()代码重构随着代码增多,函数和测试代码放⼀个⽂件,扩展难、维护难,所以适当给函数添加变量⽽避免硬编码。最终⽬的是使测试代码越简洁、越清晰。项⽬代码分为三层架构:⾃动化初期更需要好好规划代码结构和思路,不然后期重构代码越来越⼤。1、测试代码层2、业务代码层3、基础代码层基础代码层:封装了selenium、webdriviver的相关配置,如的内容# coding=utf-8from selenium import webdriverimport timefrom import Keys#

定义函数部分,减少代码量的且提⾼复⽤率# coding=utf-8from selenium import webdriverimport time#

以下为driver设置和打开测试⽹站driver = ()# def return_driver():# return driver#

打开⽹页# def open_base_site(url):# (url)#

定义函数部分,减少代码量的且提⾼复⽤率def id(element): return _element_by_id(element)def css(element): return _element_by_css_selector(element)def xpath(element): return _element_by_xpath(element)def js(element): return e_script("mentById(" + "'" + element + "'" + ").removeAttribute('readonly')")业务代码层:"""函数名:lang参数: a是url b是⽤户名 c是密码"""def land(a,b,c): driver = () (f"{a}") _element_by_id("kw").send_keys(f"{b}") _element_by_id('mn').send_keys(f"{c}") _element_by_id('submit').click() (1) ze_window()测试代码层:实现了测试⽤例。所谓的重构、优化,也就是随着项⽬的进⾏,我们需要变动基础代码层、业务代码层,从⽽使我们的测试代码层能更好的进⾏。⼀、异常处理1、selenium异常处理,参考接⼝⾃动化的异常处理,那个⾮常不错,常见异常如下:# coding=utf-8import seleniumimport logging#

操作数据库的⽅法class OperationDbInterface(object): #

初始化数据库连接 def __int__(self, a): try: if 0 == 0: pass else: print("i") #

打开游标 print("ok") except error as e: print('创建数据库失败|Mysql Error %d: %s' % ([0], [1])) #

配置⽇志格式 onfig(filename=_path + 'E:/log/', level=, format='%(asctime)s %(filename)s[line:%(lineno)d]%(levelname)s %(message)s') #

获取⽇志 logger = ger(__name__) #

输出⽇志 ion(e)

# selenium常见的9种异常。#

(1)NoSuchElementException:选择器返回元素失败时,抛出异常#

(2)ElementNotVisibleException:定位的元素在DOM中存在,在页⾯不显⽰,不能交互时#

(3)ElementNotSelectableException:选择了不可选的元素#

(4)NoSuchFrameException:要切换的frmae不存在#

(5)NoSuchWindowException:要切换的新窗⼝不存在#

(6)TimeoutException:当代码执⾏时间超出时#

(7)NoSuchAttributeException:元素的属性找不到#

(8)UnexpectedTagNameException:当⽀持类没有获得预期的web元素时#

(9)NoAlertPresentException:⼀个意外的警告⼆、⽇志模块简单介绍# coding=utf-8import logging'''函数log()定义了⽇志的基础配置'''def log(str): #

⽇志基础配置 onfig( level=, #

定义了⽇志的输出级别 datefmt='%a,%d,%b,%Y,%H:%M:%S', #

定义了⽇志输出的时间格式 filename='D:ui_', #

定义了⽇志输出路径⽂件 filemode='a', #⽇志以追加的形式进⼊ format='%(asctime)s%(filename)s%(levelname)s%(message)s' #

定义了⽇志的输出形式 ) #

定义streamhandler格式的⽇志 console = Handler() #

设置⽇志格式 matter() matter(ter('%(name)-12s:%(levelname)-8s %(message)s')) #

给⽇志添加定义后的handler ger('').addHandler(console) (str)if __name__ == "__main__": (,"我是dbug级别的") (,"我是info级别的") (G,"我是warning级别的") (,"我是error级别的") (AL,"我是critical级别的")三、智能等待因为在每⼀个定位元素的操作之前都加上等待时间太⿇烦了,所以加上全局的智能等待时间:itly_wait(10)意思就是:所有的定位操作当中,浏览器最多等10秒,超过10秒就报错了# coding=utf-8from selenium import webdriverimport timefrom import exceptions as exdriver = ()("/")ze_window()itly_wait(10)

发布者:admin,转转请注明出处:http://www.yc00.com/web/1688894514a181797.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信