IFRAME是HTML标签,作用是文档中的文档,或者浮动的框架(FRAME)。iframe元素会创建包含另外一个文档的内联框架(即行内框架)。
目录
1、分析网页源代码
分析代码可以得知,这个登录看是内嵌了一个iframe,我们如何通过利用python selenium 进行模拟登录呢?
2、编写程序代码
在这里我们主要用到一个driver.switch_to.frame("iframeID");方法,它可以切换到iframe框架内。
在切换前有一个最大加载时间,driver.implicitly_wait(30)也很重要,它的作用的是在设定时间范围内(单位:秒),如果页面加载完成,再进行下一步操作,如果网页响应时间比较久的,这个时间可以设定稍微久一点。
#!/usr/bin/python# -*- coding: UTF-8 -*-"""@author: Roc-xb"""from selenium import webdriverif __name__ == '__main__': # 加载chrome浏览器驱动 driver = webdriver.Chrome() # 打开网页地址 driver.get('http://jzjxjy.chinahrt.com/') # 最大等待时间30s driver.implicitly_wait(30) # 切换iframe框架 driver.switch_to.frame("iframe") # 输入账号 driver.find_element_by_name("userName").send_keys("422421197203060819") # 输入密码 driver.find_element_by_name("password").send_keys("123456") # 立即登录 driver.find_element_by_id("loginbtn").click()
提示,运行代码前,需要将与浏览器版本对应的Chrome浏览器驱动放置在python文件中的同级目录中,才可以正常运行,否则可能出现一个浏览器驱动加载异常等错误信息。
Original: https://blog.51cto.com/YangPC/5483089
Author: CorwinPC
Title: python selenium 如何选中iframe中的元素?
相关阅读1
Title: Python实现json串比对并输出差异结果
主要是利用递归,逐层级、逐次、逐字段比较;可以用于幂等类接口的返回体校验。
class JsonCompare:
def __init__(self, second_data, first_data, debug_model=False):
"""
用于两个json串比对,输出两串json字段差异
:param second_data: 用于比对的新json
:param first_data: 基准json
:param debug_model: 为True时将在控制台输出比对结果,默认不开启
"""
self.compare_result = [] # 存放字段差异
self.compare_error = [] # 存放字段比对异常
self.compare(second_data, first_data)
if debug_model:
for i in self.compare_result:
print(i)
for i in self.compare_error:
print(i)
def compare(self, second_data, first_data, path=''):
try:
if not isinstance(second_data, (list, tuple, dict)):
# 比对非list\tuple\dict类型的数据
if not second_data == first_data:
msg = {
'field': path,
'error_type': 'field value diff',
'secondResp': second_data,
'firstResp': first_data
}
self.compare_result.append(msg)
elif isinstance(second_data, (list, tuple)):
# 如果新数据是list/tuple,则判断老数据是否类型一致;不一致则追加到compare_error
if type(second_data) != type(first_data):
msg = {
'field': path,
'error_type': "field type diff",
'secondResp': f"type is {type(second_data)}",
'firstResp': f"type is {type(first_data)}"
}
self.compare_result.append(msg)
return
if len(second_data) != len(first_data):
msg = {
'field': path,
'error_type': "field indexLength diff",
'secondResp': f"Length of list is {len(second_data)}",
'firstResp': f"Length of list is {len(first_data)}"
}
self.compare_result.append(msg)
for index, value in enumerate(second_data):
try:
if index < len(first_data):
self.compare(
value, first_data[index], f'{path}:{index}')
else:
self.compare(value, {}, f'{path}:{index}')
except Exception as e:
self.compare_error.append(
f'Unknown error: {e.args}')
else:
# 比对值为dict类型数据
if not isinstance(first_data, dict):
msg = {
'field': path,
'error_type': "field type diff",
'secondResp': f"type is {type(second_data)}",
'firstResp': f"type is {type(first_data)}"
}
self.compare_result.append(msg)
return
new_keys = set(second_data.keys())
old_keys = set(first_data.keys())
diff_keys = old_keys - new_keys # 用于检查老数据存在某个key,但新数据不存在。
for key, value in second_data.items():
try:
if key in first_data.keys():
self.compare(
value, first_data[key], f"{path}:{key}")
else:
msg = {
'field': f"{path}:{key}",
'error_type': 'field missing',
'secondResp': value,
'firstResp': f"Field of '{key}' is not exists"
}
self.compare_result.append(msg)
except Exception as e:
self.compare_error.append(
f'Unknown error:{e.args}')
if diff_keys:
for key in diff_keys:
msg = {
'field': f"{path}:{key}",
'error_type': 'field missing',
'secondResp': f"Field of '{key}' is not exists",
'firstResp': first_data[key]
}
self.compare_result.append(msg)
except Exception as e:
self.compare_error.append(
f'Unknown error:{e.args}')
使用方法:
_old_data = {
"key1": "value1",
"key2": "value2",
"key3": [1],
"object": {
"object_key1": "object_value2",
"object_key2": {
"sub_key": "object_key2_sub_value"
},
"object_key3": [
{"list_sub_key1": "xx"},
{"list_sub_key2": "xx"}
]
},
"x": 1.2
}
_new_data = {
"key1": "value1",
"key2": "value2",
"key3": (1,),
"object": {
"object_key1": "object_value1",
"object_key2": {
"sub_key": "object_key2_sub_value",
"sub_key2": {"xx": 1}
},
"object_key3": [
{"list_sub_key1": "xx"},
{"list_sub_key2": []}
]
},
"x": 1.2
}
print("方式一:")
JsonCompare(_new_data, _old_data, debug_model=True)
print("方式二:")
json_compare = JsonCompare(_new_data, _old_data)
print(json_compare.compare_result)
print(json_compare.compare_error)
=======================================================================
方式一:
{'field': ':key3', 'error_type': 'field type diff', 'secondResp': "type is ", 'firstResp': "type is "}
{'field': ':object:object_key1', 'error_type': 'field value diff', 'secondResp': 'object_value1', 'firstResp': 'object_value2'}
{'field': ':object:object_key2:sub_key2', 'error_type': 'field missing', 'secondResp': {'xx': 1}, 'firstResp': "Field of 'sub_key2' is not exists"}
{'field': ':object:object_key3:1:list_sub_key2', 'error_type': 'field type diff', 'secondResp': "type is ", 'firstResp': "type is "}
方式二:
[{'field': ':key3', 'error_type': 'field type diff', 'secondResp': "type is ", 'firstResp': "type is "}, {'field': ':object:object_key1', 'error_type': 'field value diff', 'secondResp': 'object_value1', 'firstResp': 'object_value2'}, {'field': ':object:object_key2:sub_key2', 'error_type': 'field missing', 'secondResp': {'xx': 1}, 'firstResp': "Field of 'sub_key2' is not exists"}, {'field': ':object:object_key3:1:list_sub_key2', 'error_type': 'field type diff', 'secondResp': "type is ", 'firstResp': "type is "}]
[]
Original: https://www.cnblogs.com/micheryu/p/15481245.html
Author: 网名余先生
Title: Python实现json串比对并输出差异结果
相关阅读2
Title: python pip安装第三方包速度慢,这篇博客给你安排清楚了
⛳️ 实战场景
作为 Python 的初学者,经常要用到第三方模块的安排,常规情况下,直接使用下述命令,然后就等待去了。
pip install 模块包名
但是上述命令默认访问的是 https://pypi.org/simple/
,该站点时快时慢,有时还会下载失败,用户体验极差,本篇博客就为你展示一下国内高速源。
⛳️ pip 国内高速源
首推的是清华源,地址如下: https://pypi.tuna.tsinghua.edu.cn/simple/
,实测速度快,模块全。
在安装第三方模块时,可以直接在命令中指定下载源:
pip install 模块包名 -i https://pypi.tuna.tsinghua.edu.cn/simple/
目前稳定可用的下载源如下所示,互联网很多资料已经过时,有的下载源已经不存在。
- 阿里云:
https://mirrors.aliyun.com/pypi/simple/
- 中国科技大学:
https://pypi.mirrors.ustc.edu.cn/simple/
- 豆瓣源:
https://pypi.doubanio.com/simple/
- 华为源:
https://mirrors.huaweicloud.com/repository/pypi/simple/
需要注意:请尽量使用 https 协议!
如果觉得每次下载模块都需要输入下载源,非常不方便,可以进行一下全局配置。
linux 系统配置
在 Linux 相关系统下,修改 ~/.pip/pip.conf
即可创建全局配置,如果该文件不存在,创建即可。
mkdir ~/.pip
在 pip.conf
文件中输入如下内容,保存即可。
[global]
index-url = https://mirrors.aliyun.com/pypi/simple
[install]
trusted-host = mirrors.aliyun.com
windows 系统配置 在用户目录中新建一个 pip
目录,同步创建 pip.ini
文件,即下述路径。
C:\Users\用户名\pip\pip.ini
pip.ini
的主要一些配置:
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=mirrors.aliyun.com
📢📢📢📢📢📢 💗 你正在阅读 【梦想橡皮擦】 的博客 👍 阅读完毕,可以点点小手赞一下 🌻 发现错误,直接评论区中指正吧 📆 橡皮擦的第 篇原创博客
Original: https://blog.51cto.com/cnca/5576468
Author: 梦想橡皮擦
Title: python pip安装第三方包速度慢,这篇博客给你安排清楚了
相关阅读3
Title: 10行代码实现一个值班提醒应用
10行代码实现一个值班提醒应用
工作当中,经常遇到团队成员需要值班排班及提醒的应用场景。虽然,有一些现成的APP可以用,但是对程序员来讲使用起来不免有些繁琐,而且可能不太灵活。
那么,我们如何手撸一个简单值班排班及提醒的应用呢?
考虑一种简单的情况,对约束做如下假设:
- 值班顺序固定,一旦确定下来不再修改
- 每人值固定时间的班,比如:每人值一周
对需求假设如下:
- 在合适的时间,提醒值班人值班时间
- 提醒值班人的同时预告下一个值班人
约束和需求转化为代码如下:
on_duty_list = ['孙悟空', '沙和尚', '猪八戒', '白龙马'] # 值班人列表
on_duty_period_in_days = 7 # 每人值一周
notify_days = [1, 5] # 假设值班第一天提醒一次,第5天再提醒一次
第一个值班人值班开始时间
on_duty_first_person = '孙悟空'
on_duty_first_day = '2022-03-24 00:00:00'
提醒消息模板
notify_template = Template(r"""
【===========报警值班提醒========】
【本周值班人】${on_duty_person_this_week}
【值班时间】 ${on_duty_range}
【下周值班人】${on_duty_person_next_week}
""")
如何用程序来计算当前时间应该是哪个人值班呢?
这里用到简单数学计算:整除、取余运算
当前时间与首个值班人值班开始时间的时间差整除7天得到过了多少周,然后再对总值班人数取余,得到当前应该是第几个值班人值班。
def WhoIsOnDuty(timeTs = int(time.time())):
ref_timeTs = UnixTimeFromDate(on_duty_first_day)
deltaTs = timeTs - ref_timeTs
deltaDay = deltaTs / oneDayTs
index = deltaDay / on_duty_period_in_days % len(on_duty_list)
return on_duty_list[index]
如何计算值班时间范围呢?
这里涉及到简单的日期计算,使用了datetime库
def WhoIsOnDuty(timeTs = int(time.time())):
ref_timeTs = UnixTimeFromDate(on_duty_first_day)
deltaTs = timeTs - ref_timeTs
deltaDay = deltaTs / oneDayTs
index = deltaDay / on_duty_period_in_days % len(on_duty_list)
day_index = deltaDay % on_duty_period_in_days
ts = time.localtime(timeTs)
start_day = str(datetime.date(ts.tm_year, ts.tm_mon, ts.tm_mday) + datetime.timedelta(days = -day_index))
end_day = str(datetime.date(ts.tm_year, ts.tm_mon, ts.tm_mday) + datetime.timedelta(days = - day_index + on_duty_period_in_days - 1))
return on_duty_list[index], day_index + 1, start_day, end_day, on_duty_list[(index+1)%len(on_duty_list)]
这10行代码,是整个应用的核心。
整个应用代码如下:
#!/usr/bin/env python
coding: utf-8
import time
from string import Template
import datetime
on_duty_list = ['孙悟空', '沙和尚', '猪八戒', '白龙马']
on_duty_period_in_days = 7 # day
notify_days = [1, 5]
on_duty_first_person = '孙悟空'
on_duty_first_day = '2022-03-24 10:00:00'
oneDayTs = 24 * 60 * 60
notify_template = Template(r"""
【===========报警值班提醒========】
【本周值班人】${on_duty_person_this_week}
【值班时间】 ${on_duty_range}
【下周值班人】${on_duty_person_next_week}
""")
def SendMessage(message='test'):
print message
def PairListToMessage(pair_list):
conent_arr = []
for k, v in pair_list:
conent_arr.append(' '.join(['【' + k + '】', v]))
return '\n'.join(conent_arr)
def UnixTimeFromDate(time_str, format='%Y-%m-%d %H:%M:%S'):
# 先转换为时间数组
timeArray = time.strptime(time_str, "%Y-%m-%d %H:%M:%S")
# 转换为时间戳
timeStamp = int(time.mktime(timeArray))
return timeStamp
def DatetimeStr(timeTs, format='%Y-%m-%d %H:%M:%S'):
return time.strftime(format, time.localtime(timeTs))
def WhoIsOnDuty(timeTs = int(time.time())):
ref_timeTs = UnixTimeFromDate(on_duty_first_day)
deltaTs = timeTs - ref_timeTs
deltaDay = deltaTs / oneDayTs
index = deltaDay / on_duty_period_in_days % len(on_duty_list)
day_index = deltaDay % on_duty_period_in_days
ts = time.localtime(timeTs)
start_day = str(datetime.date(ts.tm_year, ts.tm_mon, ts.tm_mday) + datetime.timedelta(days = -day_index))
end_day = str(datetime.date(ts.tm_year, ts.tm_mon, ts.tm_mday) + datetime.timedelta(days = - day_index + on_duty_period_in_days - 1))
return on_duty_list[index], day_index + 1, start_day, end_day, on_duty_list[(index+1)%len(on_duty_list)]
周四、每周一提醒本周值班人员,下周值班人员
notify_counter = 0
on_duty_person_this_week = ''
While True:
timeTs = int(time.time())
timeStr = DatetimeStr(timeTs)
on_duty_person, day, start_day, end_day, on_duty_person_next = WhoIsOnDuty(timeTs)
if on_duty_person != on_duty_person_this_week:
on_duty_person_this_week = on_duty_person
notify_counter = 0
SendMessage(notify_template.safe_substitute({
'on_duty_person_this_week': on_duty_person,
'on_duty_person_next_week': on_duty_person_next,
'on_duty_range': '~'.join([start_day, end_day]),
}))
notify_counter += 1
else:
if notify_counter < 2 and day in notify_days:
SendMessage(notify_template.safe_substitute({
'on_duty_person_this_week': on_duty_person,
'on_duty_person_next_week': on_duty_person_next,
'on_duty_range': '~'.join([start_day, end_day]),
}))
notify_counter += 1
time.sleep(1)
效果如下:
这里留个思考题给读者,欢迎评论区交流。
- 如何实现临时调班的功能?
- 调用第三方API实现如公众号提醒、短信提醒等
如果觉得文章对你有些帮助,可以在微信公众号关注:小而美实用Python,获取更多新鲜文章。
Original: https://www.cnblogs.com/jianxinjun/p/16073971.html
Author: 简信君
Title: 10行代码实现一个值班提醒应用