每日打卡整理

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

起止时间: 2020/10/19 09:00 ~ 2020/11/21 23:59
知识点参考 https://www.cnblogs.com/superhin/p/13837611.html

  1. 编写一个函数,输入一个text参数,将函数参数放入字符串 "//*[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>总数: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

把上述变量渲染到tpl模板变量中,并将得到的包含数据的字符串按保存文本文件的方式,以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>总数:{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')

和函数

def find_element(by, value):
    print(f'通过{by}={value}定位元素')

怎样调用find_element函数将search_ipt_loc中的数据传入?

  1. 有一个字典
db_conf = {'host': '127.0.0.1', 'port': 3306, 'user': 'test', 'password': '11111', 'db': 'abc'}

和函数

def connect(host,port,user,password,db):
    print(f'连接数据{host}成功')

怎么调用函数把db_conf中的数据传入?


参考答案

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'连接数据{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. 设计一个名为Page的类,需要传入一个名为driver的参数。其中包含以下3个方法。
    (1)统一定位方法
def find_element(by, value):
   ...

by参数的选择是"id","name","class name", "tag name", "link text", "partial link text", "xpath", "css selector"
value是具体对应的元素属性或定位表达式字符串
当by=id时使用find_element_by_id方法定位,依次类推
并返回定位到的元素
(2)元素点击方法

def click(by, value):
    ...

使用by,value调用上面封装的find_element方法得到元素,然后进行点击
(3)元素输入方法

def type(by, value, text):
   ...

使用by,value调用上面封装的find_element方法得到元素, 然后输入text的值

完成后,在类下使用以下脚本进行测试

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数据

起止时间: 2020/10/22 09:00 ~ 2020/11/21 23:59
知识点:https://www.cnblogs.com/superhin/p/11495956.html

  1. 假设我们爬取到一批数据
movies = [
('肖申克的救赎','Tim Robbins', 'https://xiaoshenke.html'),
('霸王别姬','张国荣', 'https://bawangbieji.html'),
('阿甘正传','Tom Hanks', 'https://aganzhengzhuan.html'),
]

将其保存为一个movie.csv文件,并加上标题行movie,player,url

  1. 假设我们有一个data.csv文件,内容如下
a,b,excepted
1,2,3
0,0,0
-1,-1,-1
6,0.3,6.3

另外有一个函数

def add(a,b):
    return a+b

编写一个测试函数,读取csv中的每行数据,将add(a,b)的返回结果与每行的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}+{b}={excepted} 通过')
        else:
            print(f'{a}+{b}={excepted} 不通过')

每日打卡-05-两数之和问题

起止时间: 2020/10/23 09:00 ~ 2020/11/21 23:59
知识点:时间复杂度指需要Operate操作的次数的量级
完全遍历一个长度为n的列表则时间复杂度为O(n)。
如果双重循环

for i in range(n):
    for j in range(n):
     ....

则时间复杂度是O(n^2)

  1. 假设我们有一个列表
    l=[1,2,3,4,5,6,7,8] 数据不重复,目标值为6,要求找出数组中两个元素之和等于目标 的数组下标。
    要求时间复杂度小于O(n^2)

参考答案

注意,不要使用双重循环,暴力加和来和target对比,正确的做法是单层循环,然后查找target与当前值的差,是否存在于列表中。
但是由于列表的in查询时间复杂度是O(n),即隐含了一层循环,这样效率其实和双重循环是一样的,都是O(n^2)。
这里就可以使用哈希来优化查询差值是否在列表中操作,将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:   # 在集合中查找,为避免重复,判断a为较小的那个值
        result.append((list1.index(a), list1.index(b)))   # 列表index取下标的操作为O(1) 
print(result)

每日打卡-06-列表字典推导式

起止时间: 2020/10/26 11:08 ~ 2020/10/31 23:59
知识点:https://www.cnblogs.com/superhin/p/13877327.html

  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': '新用户优惠', 'activityId': 15801, 'start_time': '20201020', 'end_time': '20201220', 'state': 1},
    ]
 }

已知state=0为未开始,1为进行中,2为以结束,使用列表推导式得到当前所有进行中的activityId列表,要求每个activityId转为字符串形式。

  1. Cookies格式转化
    假设我们需要通过登录接口绕过Selenium登录操作,我们需要使用requests发送登录接口,得到响应中的cookies然后再使用driver.add_cookie方法添加的浏览器中。
    接口返回的cookies是一个字典格式,如{'Token', 'abcdefg', 'SessionID': '1234567'}
    而selenium添加cookie时需要这样的格式,{'name': 'Token': 'value': 'abcdefg'}{'name': 'SessionID': 'value': '123456'}
    使用推导式实现完成转换
cookies = {'Token':'abcdefg', 'SessionID': '1234567'} 
# 转为
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': '新用户优惠', '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-路径组装和获取环境变量

起止时间: 2020/10/27 08:56 ~ 2020/11/27 23:59
知识点:https://www.cnblogs.com/superhin/p/13880748.html

  1. 有一个项目结构如下
autotest/
    data/
        data.csv
    testcases/
        baidu.py

在baidu.py中如何组装出项目的根路径以及data.csv文件的路径

  1. 在系统中(Win 环境变量设置, Mac sudo vim ~/.bash_profilesource ~/.bash_profile)手工添加两个环境变量
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类中有哪几种方法,分别怎么调用?

参考答案

3种,类方法,实例方法,静态方法,类方法使用类名调用,
实例方法需要创建实例使用实例调用,静态方法使用类名或者实例都可以调用。

每日打卡-09-使用ini配置文件

起止时间: 2020/10/29 12:23 ~ 2020/11/27 23:59
知识点:https://www.cnblogs.com/superhin/p/13883802.html

  1. 手工新建一个配置文件config.ini,内容如下
[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
知识点:二分查找是一种比较快的查找算法,首先需要序列有序。
思想是先用序列中间数和目标值对比,如果目标值小,则从前半部分(小于中间数)重复此查找,否则从后半部分重复此查找,直到目标值左右两边没有值。

    1. 已知一个列表
l = [0, 9, 8, 1, 10, 2, 5, 3, 11, 6, 13, 100, 24]
l.sort()  # 对列表进行排序

此时l=[0, 1, 2, 3, 5, 6, 8, 9, 10, 11, 13, 24, 100]
编写一个二分查找算法,查找排序后l中8的索引。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 229,362评论 6 537
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,013评论 3 423
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 177,346评论 0 382
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,421评论 1 316
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,146评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,534评论 1 325
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,585评论 3 444
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,767评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,318评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,074评论 3 356
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,258评论 1 371
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,828评论 5 362
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,486评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,916评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,156评论 1 290
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,993评论 3 395
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,234评论 2 375