每日打卡-01-字符串填空
起止時間: 2020/10/19 09:00 ~ 2020/11/21 23:59
知識點參考 https://www.cnblogs.com/superhin/p/13837611.html
- 編寫一個函數(shù),輸入一個text參數(shù),將函數(shù)參數(shù)放入字符串 "http://*[text()='所傳text參數(shù)']"指定位置中,并打印這個字符串
- 定義一個多行文本
tpl = '''
<html>
<head><meta charset="UTF-8"><title>title變量位置</title></head>
<body>
<h1>report_name變量位置</h1>
<div>開始時間:start_at變量位置 運行時間:duration變量位置 秒</div>
<div>總數(shù):testRuns變量位置 通過:successes變量位置 失?。篺ailures變量位置 異常: errors變量位置</div>
</body>
<html>'''
已知變量
title="測試報告"
report_name="接口測試報告"
start_at="2020-09-10 10:00:00"
duration=3
testRuns=20
successes=15
failures=4
errors=1
把上述變量渲染到tpl模板變量中,并將得到的包含數(shù)據(jù)的字符串按保存文本文件的方式,以utf-8編碼的格式保存為一個名稱為report.html的文件。
參考答案
# 1
def xpath(text):
return f'//*[text()="{text}"]
# 2
tpl = '''
<html>
<head><meta charset="UTF-8"><title>{title}</title></head>
<body>
<h1>{report_name}</h1>
<div>開始時間:{start_at} 運行時間:{duration} 秒</div>
<div>總數(shù):{testRuns} 通過:{successes} 失?。簕failures} 異常: {errors}</div>
</body>
<html>'''
title="測試報告"
report_name="接口測試報告"
start_at="2020-09-10 10:00:00"
duration=3
testRuns=20
successes=15
failures=4
errors=1
html = tpl.format(title=title, report_name=report_name, start_at=start_at, duration=duration,
testRuns=testRuns, successes=successes, failures=failures, errors=errors)
with open('report.html, 'w', encoding='utf-8') as f:
f.write(html)
每日打卡-02-列表和字典解包
起止時間: 2020/10/20 09:00 ~ 2020/11/21 23:59
知識點:https://www.cnblogs.com/superhin/p/13837849.html
- 有一個變量
search_ipt_loc = ('id', 'kw')
和函數(shù)
def find_element(by, value):
print(f'通過{by}={value}定位元素')
怎樣調(diào)用find_element函數(shù)將search_ipt_loc中的數(shù)據(jù)傳入?
- 有一個字典
db_conf = {'host': '127.0.0.1', 'port': 3306, 'user': 'test', 'password': '11111', 'db': 'abc'}
和函數(shù)
def connect(host,port,user,password,db):
print(f'連接數(shù)據(jù){host}成功')
怎么調(diào)用函數(shù)把db_conf中的數(shù)據(jù)傳入?
參考答案
search_ipt_loc = ('id', 'kw')
def find_element(by, value):
print(f'通過{by}={value}定位元素')
db_conf = {'host': '127.0.0.1', 'port': 3306, 'user': 'test', 'password': '11111', 'db': 'abc'}
def connect(host,port,user,password,db):
print(f'連接數(shù)據(jù){host}成功')
find_element(*search_ipt_loc)
connect(**db_conf)
每日打卡-03-使用對象在方法間共享屬性
起止時間: 2020/10/21 09:00 ~ 2020/11/21 23:59
知識點:https://www.cnblogs.com/superhin/p/13841854.html
- 設(shè)計一個名為Page的類,需要傳入一個名為driver的參數(shù)。其中包含以下3個方法。
(1)統(tǒng)一定位方法
def find_element(by, value):
...
by參數(shù)的選擇是"id","name","class name", "tag name", "link text", "partial link text", "xpath", "css selector"
value是具體對應(yīng)的元素屬性或定位表達(dá)式字符串
當(dāng)by=id時使用find_element_by_id方法定位,依次類推
并返回定位到的元素
(2)元素點擊方法
def click(by, value):
...
使用by,value調(diào)用上面封裝的find_element方法得到元素,然后進(jìn)行點擊
(3)元素輸入方法
def type(by, value, text):
...
使用by,value調(diào)用上面封裝的find_element方法得到元素, 然后輸入text的值
完成后,在類下使用以下腳本進(jìn)行測試
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
baidu = Page(driver)
baidu.type('id', 'kw', '簡書 韓志超')
baidu.click('id', 'su')
sleep(3)
driver.quit()
參考答案
from selenium.webdriver.remote.webdriver import WebDriver
from selenium.webdriver.remote.webelement import WebElement
class Page(object):
def __init__(self, driver: WebDriver):
self.driver = driver
def find_element(self, by: str, value: str) -> WebElement:
method_map = {
'id': self.driver.find_element_by_id,
'name': self.driver.find_element_by_name,
'class name': self.driver.find_element_by_class_name,
'tag name': self.driver.find_element_by_tag_name,
'link text': self.driver.find_element_by_link_text,
'partial link text': self.driver.find_element_by_partial_link_text,
'xpath': self.driver.find_element_by_xpath,
'css selector': self.driver.find_element_by_css_selector,
}
if by not in method_map:
raise ValueError('不支持該定位方法')
func = method_map.get(by)
element = func(value)
return element
def click(self, by: str, value: str) -> None:
print(f'點擊元素{by}={value}')
self.find_element(by, value).click()
def type(self, by: str, value: str, text: str) -> None:
print(f'元素{by}={value}中輸入{text}')
send_key = self.find_element(by, value)
send_key.send_keys(text)
if __name__ == '__main__':
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
baidu = Page(driver)
baidu.type("id", "kw", "簡書 韓志超")
baidu.click("id", "su")
sleep(3)
driver.quit()
每日打卡04-使用CSV數(shù)據(jù)
起止時間: 2020/10/22 09:00 ~ 2020/11/21 23:59
知識點:https://www.cnblogs.com/superhin/p/11495956.html
- 假設(shè)我們爬取到一批數(shù)據(jù)
movies = [
('肖申克的救贖','Tim Robbins', 'https://xiaoshenke.html'),
('霸王別姬','張國榮', 'https://bawangbieji.html'),
('阿甘正傳','Tom Hanks', 'https://aganzhengzhuan.html'),
]
將其保存為一個movie.csv文件,并加上標(biāo)題行movie,player,url
- 假設(shè)我們有一個data.csv文件,內(nèi)容如下
a,b,excepted
1,2,3
0,0,0
-1,-1,-1
6,0.3,6.3
另外有一個函數(shù)
def add(a,b):
return a+b
編寫一個測試函數(shù),讀取csv中的每行數(shù)據(jù),將add(a,b)的返回結(jié)果與每行的excepted對比,如果成打印成功
失敗則打印失敗。
參考答案
import csv
# 1
movies = [
('肖申克的救贖','Tim Robbins', 'https://xiaoshenke.html'),
('霸王別姬','張國榮', 'https://bawangbieji.html'),
('阿甘正傳','Tom Hanks', 'https://aganzhengzhuan.html'),
]
header = ('movie','player','url')
with open('movie.csv', 'w', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(header)
writer.writerows(movies)
# 2
def add(a, b):
return a + b
with open('data.csv', encoding='utf-8') as f:
data = csv.reader(f)
for a, b, excepted in data:
a, b, excepted = float(a), float(b), float(excepted)
if add(a, b) == excepted:
print(f'{a}+={excepted} 通過')
else:
print(f'{a}+={excepted} 不通過')
每日打卡-05-兩數(shù)之和問題
起止時間: 2020/10/23 09:00 ~ 2020/11/21 23:59
知識點:時間復(fù)雜度指需要Operate操作的次數(shù)的量級
完全遍歷一個長度為n的列表則時間復(fù)雜度為O(n)。
如果雙重循環(huán)
for i in range(n):
for j in range(n):
....
則時間復(fù)雜度是O(n^2)
- 假設(shè)我們有一個列表
l=[1,2,3,4,5,6,7,8] 數(shù)據(jù)不重復(fù),目標(biāo)值為6,要求找出數(shù)組中兩個元素之和等于目標(biāo) 的數(shù)組下標(biāo)。
要求時間復(fù)雜度小于O(n^2)
參考答案
注意,不要使用雙重循環(huán),暴力加和來和target對比,正確的做法是單層循環(huán),然后查找target與當(dāng)前值的差,是否存在于列表中。
但是由于列表的in查詢時間復(fù)雜度是O(n),即隱含了一層循環(huán),這樣效率其實和雙重循環(huán)是一樣的,都是O(n^2)。
這里就可以使用哈希來優(yōu)化查詢差值是否在列表中操作,將O(n)降為O(1),因此總體的效率就會變成O(n^2)->O(n)。
l = [1,2,3,4,5,6,7,8]
set1 = set(list1) # 使用集合已方便查找
target = 6
result = []
for a in list1:
b = target - a
if a < b < target and b in set1: # 在集合中查找,為避免重復(fù),判斷a為較小的那個值
result.append((list1.index(a), list1.index(b))) # 列表index取下標(biāo)的操作為O(1)
print(result)
每日打卡-06-列表字典推導(dǎo)式
起止時間: 2020/10/26 11:08 ~ 2020/10/31 23:59
知識點:https://www.cnblogs.com/superhin/p/13877327.html
- 數(shù)據(jù)篩選
假設(shè)一個活動列表接口數(shù)據(jù)如下
res = {
'code': 0,
'msg': '成功',
'datas': [
{'activityName': '雙11折扣', 'activityId': 12543, 'start_time': '20201020', 'end_time': '20201120', 'state': 1},
{'activityName': '今日折扣', 'activityId': 23413, 'start_time': '20201020', 'end_time': '20201021', 'state': 2},
{'activityName': '大減價', 'activityId': 13265, 'start_time': '20201019', 'end_time': '20201120', 'state': 0},
{'activityName': '每日促銷', 'activityId': 19876, 'start_time': '20201020', 'end_time': '20201121', 'state': 0},
{'activityName': '新用戶優(yōu)惠', 'activityId': 15801, 'start_time': '20201020', 'end_time': '20201220', 'state': 1},
]
}
已知state=0為未開始,1為進(jìn)行中,2為以結(jié)束,使用列表推導(dǎo)式得到當(dāng)前所有進(jìn)行中的activityId列表,要求每個activityId轉(zhuǎn)為字符串形式。
- Cookies格式轉(zhuǎn)化
假設(shè)我們需要通過登錄接口繞過Selenium登錄操作,我們需要使用requests發(fā)送登錄接口,得到響應(yīng)中的cookies然后再使用driver.add_cookie方法添加的瀏覽器中。
接口返回的cookies是一個字典格式,如{'Token', 'abcdefg', 'SessionID': '1234567'}
而selenium添加cookie時需要這樣的格式,{'name': 'Token': 'value': 'abcdefg'}和{'name': 'SessionID': 'value': '123456'}
使用推導(dǎo)式實現(xiàn)完成轉(zhuǎn)換
cookies = {'Token':'abcdefg', 'SessionID': '1234567'}
# 轉(zhuǎn)為
cookies = [{'name': 'Token': 'value': 'abcdefg'},{'name': 'SessionID': 'value': '123456'}]
參考答案
# 1
res = {
'code': 0,
'msg': '成功',
'datas': [
{'activityName': '雙11折扣', 'activityId': 12543, 'start_time': '20201020', 'end_time': '20201120', 'state': 1},
{'activityName': '今日折扣', 'activityId': 23413, 'start_time': '20201020', 'end_time': '20201021', 'state': 2},
{'activityName': '大減價', 'activityId': 13265, 'start_time': '20201019', 'end_time': '20201120', 'state': 0},
{'activityName': '每日促銷', 'activityId': 19876, 'start_time': '20201020', 'end_time': '20201121', 'state': 0},
{'activityName': '新用戶優(yōu)惠', 'activityId': 15801, 'start_time': '20201020', 'end_time': '20201220', 'state': 1},
]
}
activity_ids = [str(item.get('activityId') for item in res.get('datas', [])]
# 2
cookies = {'Token':'abcdefg', 'SessionID': '1234567'}
cookies = [{'name': key, 'value': value} for key, value in cookies.items()]
每日打卡-07-路徑組裝和獲取環(huán)境變量
起止時間: 2020/10/27 08:56 ~ 2020/11/27 23:59
知識點:https://www.cnblogs.com/superhin/p/13880748.html
- 有一個項目結(jié)構(gòu)如下
autotest/
data/
data.csv
testcases/
baidu.py
在baidu.py中如何組裝出項目的根路徑以及data.csv文件的路徑
- 在系統(tǒng)中(Win 環(huán)境變量設(shè)置, Mac
sudo vim ~/.bash_profile并source ~/.bash_profile)手工添加兩個環(huán)境變量
USER=admin
PASSWORD=123456
并在baidu.py中讀取出來這兩個變量的值
參考答案
import os
# 1
base_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__)
data_file = os.path.join(base_dir, 'data', 'data.csv')
# 2
user = os.getenv('USER')
password = os.getenv('PASSWORD')
每日打卡-08-Python類中的不同方法
起止時間: 2020/10/28 12:23 ~ 2020/11/27 23:59
知識點:https://www.cnblogs.com/superhin/p/13884123.html
- Python類中有哪幾種方法,分別怎么調(diào)用?
參考答案
3種,類方法,實例方法,靜態(tài)方法,類方法使用類名調(diào)用,
實例方法需要創(chuàng)建實例使用實例調(diào)用,靜態(tài)方法使用類名或者實例都可以調(diào)用。
每日打卡-09-使用ini配置文件
起止時間: 2020/10/29 12:23 ~ 2020/11/27 23:59
知識點:https://www.cnblogs.com/superhin/p/13883802.html
- 手工新建一個配置文件config.ini,內(nèi)容如下
[user]
name=admin
password=123456
is_admin=true
[mysql]
host=10.10.10.10
port=3306
db=apitest
user=root
password=123456
讀取mysql段的配置,并得到一個字典變量
db_conf={'host': '10.10.10.10', 'port': 3306, 'db': 'apitest', 'user': 'root', 'password': '123456'}
注意:port需要是整型
每日打卡-10-二分查找
起止時間: 2020/10/30 22:08 ~ 2020/11/27 23:59
知識點:二分查找是一種比較快的查找算法,首先需要序列有序。
思想是先用序列中間數(shù)和目標(biāo)值對比,如果目標(biāo)值小,則從前半部分(小于中間數(shù))重復(fù)此查找,否則從后半部分重復(fù)此查找,直到目標(biāo)值左右兩邊沒有值。
- 已知一個列表
l = [0, 9, 8, 1, 10, 2, 5, 3, 11, 6, 13, 100, 24]
l.sort() # 對列表進(jìn)行排序
此時l=[0, 1, 2, 3, 5, 6, 8, 9, 10, 11, 13, 24, 100]
編寫一個二分查找算法,查找排序后l中8的索引。