python selenium 如何选中iframe中的元素?

Python62

IFRAME是​​HTML​​标签,作用是文档中的文档,或者浮动的框架(FRAME)。iframe元素会创建包含另外一个文档的内联框架(即行内框架)。

目录

​1、分析网页源代码​

​2、编写程序代码​

1、分析网页源代码

python selenium 如何选中iframe中的元素?

分析代码可以得知,这个登录看是内嵌了一个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行代码实现一个值班提醒应用

python selenium 如何选中iframe中的元素?

工作当中,经常遇到团队成员需要值班排班及提醒的应用场景。虽然,有一些现成的APP可以用,但是对程序员来讲使用起来不免有些繁琐,而且可能不太灵活。

那么,我们如何手撸一个简单值班排班及提醒的应用呢?
python selenium 如何选中iframe中的元素?

考虑一种简单的情况,对约束做如下假设:

  • 值班顺序固定,一旦确定下来不再修改
  • 每人值固定时间的班,比如:每人值一周

对需求假设如下:

  • 在合适的时间,提醒值班人值班时间
  • 提醒值班人的同时预告下一个值班人

约束和需求转化为代码如下:


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)

效果如下:
python selenium 如何选中iframe中的元素?

这里留个思考题给读者,欢迎评论区交流。

  • 如何实现临时调班的功能?
  • 调用第三方API实现如公众号提醒、短信提醒等

如果觉得文章对你有些帮助,可以在微信公众号关注:小而美实用Python,获取更多新鲜文章。

Original: https://www.cnblogs.com/jianxinjun/p/16073971.html
Author: 简信君
Title: 10行代码实现一个值班提醒应用