每日打卡整理

每日打卡-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 = '''

title变量位置

report_name变量位置

开始时间:start_at变量位置 运行时间:duration变量位置 秒
总数:testRuns变量位置 通过:successes变量位置 失败:failures变量位置 异常: errors变量位置
'''

已知变量

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 = '''

{title}

{report_name}

开始时间:{start_at} 运行时间:{duration} 秒
总数:{testRuns} 通过:{successes} 失败:{failures} 异常: {errors}
''' 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的索引。

你可能感兴趣的:(每日打卡整理)