每日打卡-01-字符串填空
起止时间: 2020/10/19 09:00 ~ 2020/11/21 23:59
知识点参考 https://www.cnblogs.com/superhin/p/13837611.html
- 编写一个函数,输入一个text参数,将函数参数放入字符串 "//*[text()='所传text参数']"指定位置中,并打印这个字符串
- 定义一个多行文本
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
- 有一个变量
search_ipt_loc = ('id', 'kw')
和函数
def find_element(by, value):
print(f'通过{by}={value}定位元素')
怎样调用find_element函数将search_ipt_loc中的数据传入?
- 有一个字典
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
- 设计一个名为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
- 假设我们爬取到一批数据
movies = [
('肖申克的救赎','Tim Robbins', 'https://xiaoshenke.html'),
('霸王别姬','张国荣', 'https://bawangbieji.html'),
('阿甘正传','Tom Hanks', 'https://aganzhengzhuan.html'),
]
将其保存为一个movie.csv文件,并加上标题行movie,player,url
- 假设我们有一个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)
- 假设我们有一个列表
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
- 数据筛选
假设一个活动列表接口数据如下
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转为字符串形式。
- 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
- 有一个项目结构如下
autotest/
data/
data.csv
testcases/
baidu.py
在baidu.py中如何组装出项目的根路径以及data.csv文件的路径
- 在系统中(Win 环境变量设置, Mac
sudo vim ~/.bash_profile
并source ~/.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
- Python类中有哪几种方法,分别怎么调用?
参考答案
3种,类方法,实例方法,静态方法,类方法使用类名调用,
实例方法需要创建实例使用实例调用,静态方法使用类名或者实例都可以调用。
每日打卡-09-使用ini配置文件
起止时间: 2020/10/29 12:23 ~ 2020/11/27 23:59
知识点:https://www.cnblogs.com/superhin/p/13883802.html
- 手工新建一个配置文件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
知识点:二分查找是一种比较快的查找算法,首先需要序列有序。
思想是先用序列中间数和目标值对比,如果目标值小,则从前半部分(小于中间数)重复此查找,否则从后半部分重复此查找,直到目标值左右两边没有值。
- 已知一个列表
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的索引。
网友评论