每日打卡整理

每日打卡-01-字符串填空

起止時間: 2020/10/19 09:00 ~ 2020/11/21 23:59
知識點參考 https://www.cnblogs.com/superhin/p/13837611.html

  1. 編寫一個函數(shù),輸入一個text參數(shù),將函數(shù)參數(shù)放入字符串 "http://*[text()='所傳text參數(shù)']"指定位置中,并打印這個字符串
  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變量位置 失?。篺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

  1. 有一個變量
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ù)傳入?

  1. 有一個字典
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

  1. 設(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

  1. 假設(shè)我們爬取到一批數(shù)據(jù)
movies = [
('肖申克的救贖','Tim Robbins', 'https://xiaoshenke.html'),
('霸王別姬','張國榮', 'https://bawangbieji.html'),
('阿甘正傳','Tom Hanks', 'https://aganzhengzhuan.html'),
]

將其保存為一個movie.csv文件,并加上標(biāo)題行movie,player,url

  1. 假設(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)

  1. 假設(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

  1. 數(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)為字符串形式。

  1. 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

  1. 有一個項目結(jié)構(gòu)如下
autotest/
    data/
        data.csv
    testcases/
        baidu.py

在baidu.py中如何組裝出項目的根路徑以及data.csv文件的路徑

  1. 在系統(tǒng)中(Win 環(huán)境變量設(shè)置, Mac sudo vim ~/.bash_profilesource ~/.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

  1. 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

  1. 手工新建一個配置文件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)值左右兩邊沒有值。

    1. 已知一個列表
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的索引。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容