Selenium处理异步加载请求获取XHR消息体的2种方法

这篇具有很好参考价值的文章主要介绍了Selenium处理异步加载请求获取XHR消息体的2种方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

通过Log读取XHR

简单使用示例


Selenium处理异步加载请求获取XHR消息体的2种方法

异步加载情况下,不涉及浏览器全局的加载,因此selenium会直接往下执行,这就导致异步结果还没返回,脚本就继续执行了。


方法一、通过Log读取XHR

构造chrome driver:

chrome_options = Options()
# -------------------------------------------------------------------- #
chrome_options.add_argument("--allow-running-insecure-content")
chrome_options.add_argument("--ignore-certificate-errors")
chrome_options.add_argument("--disable-single-click-autofill")
chrome_options.add_argument("--disable-autofill-keyboard-accessory-view[8]")
chrome_options.add_argument("--disable-full-form-autofill-ios")
chrome_options.add_experimental_option('perfLoggingPrefs', {
    'enableNetwork': True,
    'enablePage': False,
})
caps = DesiredCapabilities.CHROME
caps['goog:loggingPrefs'] = {
    'browser': 'ALL',
    'performance': 'ALL',
}
caps['perfLoggingPrefs'] = {
    'enableNetwork': True,
    'enablePage': False,
    'enableTimeline': False
}
# -------------------------------------------------------------------- #

driver = webdriver.Chrome(options=chrome_options, desired_capabilities=caps)

通过log来获取xhr:

def get_xhr_logs(driver):
    log_xhr_array = []
    for typelog in driver.log_types:
    perfs = driver.get_log(typelog)
    for row in perfs:
        log_data = row
        message_ = log_data['message']
        try:
            log_json = json.loads(message_)
            log = log_json['message']
            if log['method'] == 'Network.responseReceived':
                # 去掉静态js、css等,仅保留xhr请求
                type_ = log['params']['type']
                id = log['params']['requestId']
                if type_.upper() == "XHR":
                    # log_xhr_array.append(log)
                    log_xhr_array.append(id)
        except:
            pass
    return log_xhr_array

其中,上述中“message”的消息如下:

{
	'method': 'Network.responseReceived',
	'params': {
		'frameId': '77E0FFEEDA6B3CE3ADACCD6133701429',
		'loaderId': 'DA184885509BC77DB2426FCDB768E5FA',
		'requestId': '5620.89',
		'response': {
			'connectionId': 512,
			'connectionReused': False,
			'encodedDataLength': 295,
			'fromDiskCache': False,
			'fromPrefetchCache': False,
			'fromServiceWorker': False,
			'headers': {
				'access-control-allow-origin': '*',
				'cache-control': 'no-cache',
				'content-length': '271',
				'content-type': 'application/json',
				'date': 'Thu, 14 Apr 2022 08:15:24 GMT',
				'via': '1.1 4fe583422d0b309b9b1d4505e54b137c.cloudfront.net (CloudFront)',
				'x-amz-cf-id': 'bhkU5eqTsWXmJRXa1AUu2mto5kMsWoWR-ePxEFpXHeS3uUIRd-7seA==',
				'x-amz-cf-pop': 'JFK51-C1',
				'x-branch-request-id': '95066afcbce046c482bdea654034402a-2022041408',
				'x-cache': 'Miss from cloudfront'
			},
			'mimeType': 'application/json',
			'protocol': 'h2',
			'remoteIPAddress': '192.154.249.210',
			'remotePort': 9000,
			'responseTime': 1649924123904.849,
			'securityDetails': {
				'certificateId': 0,
				'certificateTransparencyCompliance': 'unknown',
				'cipher': 'AES_128_GCM',
				'issuer': 'DigiCert TLS RSA SHA256 2020 CA1',
				'keyExchange': '',
				'keyExchangeGroup': 'X25519',
				'protocol': 'TLS 1.3',
				'sanList': ['*.branch.io', 'branch.io'],
				'signedCertificateTimestampList': [],
				'subjectName': '*.branch.io',
				'validFrom': 1635292800,
				'validTo': 1669593599
			},
			'securityState': 'secure',
			'status': 200,
			'statusText': '',
			'timing': {
				'connectEnd': 1470.717,
				'connectStart': 0.071,
				'dnsEnd': -1,
				'dnsStart': -1,
				'proxyEnd': -1,
				'proxyStart': -1,
				'pushEnd': 0,
				'pushStart': 0,
				'receiveHeadersEnd': 2177.895,
				'requestTime': 233026.325475,
				'sendEnd': 1471.578,
				'sendStart': 1471.22,
				'sslEnd': 1470.707,
				'sslStart': 961.743,
				'workerFetchStart': -1,
				'workerReady': -1,
				'workerRespondWithSettled': -1,
				'workerStart': -1
			},
			'url': 'https://api2.branch.io/v1/open'
		},
		'timestamp': 233028.504486,
		'type': 'XHR'
	}
}

通过requestId可以获得详细的消息体:

def get_xhr_body(driver, requestId):
    response_body = driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': requestId})
    return response_body

简单使用示例

driver.find_element(by=By.XPATH, value='//*[@id="main"]/div[1]/form/button').send_keys(Keys.ENTER)
response = None
login_type = LoginType.Fail
while True:
    ids = get_xhr_logs(driver)
    print('>> 等待异步加载中...')
    if ids:
        for id in ids:
            try:
                body = get_xhr_body(driver, id)
                response = eval(body['body'])
                print(response)
                if response.get('token'):
                    login_type = LoginType.Success
                break
            except Exception:
                pass
        break
    time.sleep(0.5)
return login_type, response

方法二、使用开源工具selenium-wire

Github:https://github.com/wkeeling/selenium-wire

与selenium无缝衔接,非常好用~~

示例代码后期再补,可先自行前往官网查看。文章来源地址https://www.toymoban.com/news/detail-400828.html

到了这里,关于Selenium处理异步加载请求获取XHR消息体的2种方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Addressable 异步加载场景并获取加载进度

    一开始用PercentComplete函数获取加载进度,发现每次都是从0.85开始计算,不准,官方文档解释:“ PercentComplete 将反映总体操作的进展情况,而不会准确地表示仅下载百分比或加载到内存中的百分比。 ” ,“ 要获得准确的下载百分比,请使用GetDownloadStatus()。” GetDownloadStatu

    2024年02月12日
    浏览(37)
  • Spring/SpringBoot 过滤器修改、获取http 请求request中的参数 和 response返回值,比如修改请求体和响应体的字符编码

    通过自定义filter,RequestWrapper,ResponseWrapper 处理请求和响应数据,比如修改请求体和响应体的字符编码 1.request 和 response 中的数据都是 存在流中的(缓存中)获取一次就没有了,需要重新写回去。所以需要两个包装类分别继承HttpServletRequestWrapper 和 HttpServletResponseWrapper 对 r

    2024年02月15日
    浏览(39)
  • 安卓之异步消息处理机制

    简介 为什么叫异步消息处理机制? 先来看同步消息机制,它是指发送方必须等待接收方处理完消息后才能继续执行,也就是顺序执行。在 Android 中,如果在主线程中执行耗时操作,就会导致主线程阻塞,应用无法响应用户交互,这就是同步阻塞的例子。因此,需要在子线程

    2024年02月12日
    浏览(37)
  • Spring Boot 如何实现异步消息处理

    在现代应用程序中,异步消息处理是一项至关重要的任务。它可以提高应用程序的性能、可伸缩性和可靠性,同时也可以提供更好的用户体验。Spring Boot提供了多种方式来实现异步消息处理,包括使用Spring AMQP、Spring Kafka和Spring JMS等。本文将介绍如何使用Spring Boot实现异步消息

    2024年02月07日
    浏览(45)
  • SpringBoot对接kafka,批量、并发、异步获取消息,并动态、批量插入库表

    SpringBoot对接kafka,批量、并发、异步获取消息,并动态、批量插入库表  更多优秀文章,请扫码关注个人微信公众号或搜索“ 程序猿小杨 ”添加。 一、背景         因业务发展需要,需要对接kafka,快速批量接收消息日志,避免消息日志累积过多,必须做到数据处理后,动态

    2024年02月10日
    浏览(33)
  • Java发起同异步HTTP请求和处理数据

    📚专栏 「Java数据集成」专栏 《Java发起HTTP请求并解析JSON返回数据》:下图简称为《请求和解析》 《基于MyBatis实现依次、批量、分页增删改查操作》:下图简称为《依批分增删改查》 《用Python根据JSON生成Java类代码和数据库建表SQL语句》:下图简称为《生成代码脚本》 《基

    2023年04月21日
    浏览(46)
  • 直播弹幕系统(二)- 整合RabbitMQ进行消息广播和异步处理

    上一篇文章 SpringCloud网关对WebSocket链接进行负载均衡 中把主要的架子搭建好了,这一篇文章就要开始写业务逻辑了。在分布式系统下,如何达到SpringBoot - WebSocket的使用和聊天室练习的效果。 我们页面上,通过 WebSocket 发送弹幕信息的时候,后端通过 @OnMessage 注解修饰的函数

    2023年04月08日
    浏览(37)
  • Vue 网络处理 - axios 异步请求的使用,请求响应拦截器(最佳实践)

    目录 一、axiox 1.1、axios 简介 1.2、axios 基本使用 1.2.1、下载核心 js 文件. 1.2.2、发送 GET 异步请求 1.2.3、发送 POST 异步请求 1.2.4、发送 GET、POST 请求最佳实践 1.3、请求响应拦截器 1.3.1、拦截器解释 1.3.2、请求拦截器的使用 1.3.3、响应拦截器的使用 1.3.4、拦截器在 Vue 脚手架中的

    2024年02月04日
    浏览(43)
  • okhttp异步get和post请求,实现读取获取、增加http文件数据

    Okhttp类,封装方法 activity类 MainActivity

    2024年02月14日
    浏览(27)
  • selenium获取请求和响应

    1.下载browsermob-proxy 2.代码实现

    2024年01月19日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包