如图所示给出的是项目重构的三层架构示意图:
示例:本次涉及的项目使用的12306 selenium 重构-----代码分层优化
基于以上原则,将selenium,webdriver相关的配置加入functions.py基础代码文件中,便于底层调用。
functions.py代码如下:
# coding = utf-8
# Date: 2022/3/29 16:26
'''基础常用方法'''
from datetime import date,timedelta
from selenium import webdriver
from selenium.webdriver.common.by import By
# 将driver设置为全局变量
driver = webdriver.Chrome()
def return_driver():
'''
函数return_driver()的功能是返回driver对象
:return:driver对象
'''
return driver
def open_base_site(url):
'''
打开网页
:param url:要打开的网页地址
:return:
'''
driver.get(url)
def max_window():
'''
浏览器窗口最大化
:return:
'''
driver.maximize_window()
def close_driver():
'''
关闭浏览器
:return:
'''
driver.quit()
# 以下为定义函数部分,其目的是返回今天后的第n天后的日期,格式为“2022-03-28”
def date_n(n):
return str((date.today() + timedelta(days=int(n))).strftime('%Y-%m-%d'))
def id(element):
'''
根据元素id属性值来返回元素定位语句。
:param element: id属性值
:return:按照id属性来定位元素的语句
'''
return driver.find_element(By.ID, element)
def xpath(element):
'''
使用xpath定位元素
:param element:
:return:按照xpath方式来定位元素的语句
'''
return driver.find_element(By.XPATH, element)
对于业务代码层,可以将之前的测试代码根据功能模块等进行拆分,比如在此项目中,可以将搜索车次的功能单独抽取成一个文件,如search_tickets.py,它属于业务代码层。
search_tickets.py代码如下:
# coding = utf-8
# Date: 2022/3/29 16:27
from functions import return_driver, open_base_site,max_window,date_n,xpath,id
def search_tickets(from_station, to_station, n, url):
'''
搜索车次
:param from_station: 出发城市
:param to_station: 到达城市
:param n: 一个数字,如1表示选择明天的车票,2表示选择后台的车票
:param url: 要访问的网站地址
:return:
'''
# tomorrow变量:出发日期
tomorrow = date_n(n)
# 打开浏览器
driver = return_driver()
# 打开网站
open_base_site(url)
# 设置窗口最大化
max_window()
# 输入出发城市
xpath('//input[@id="fromStationText"]').click()
xpath('//input[@id="fromStationText"]').send_keys(from_station)
xpath('//div[@id="citem_2"]').click()
# 输入到达城市
xpath('//input[@id="toStationText"]').click()
xpath('//input[@id="toStationText"]').send_keys(to_station)
xpath('//div[@id="citem_1"]').click()
# 输入出发时间
id('train_date').clear()
id('train_date').send_keys(tomorrow)
# 点击查询
id('search_one').click()
# 切换到新窗口
driver.switch_to.window(driver.window_handles[1])
# 点击D2244车次的预订
xpath('//tr[starts-with(@id,"ticket_76000D22440N_01_06")]/td/a').click()
login.py文件代码如下:
最终的测试代码文件test_booking_tickets.py如下: