Selenium-介绍下其他骚操作

Chrome DevTools 简介

Chrome DevTools 是一组直接内置在基于 Chromium 的浏览器(如 Chrome、Opera 和 Microsoft Edge)中的工具,用于帮助开发人员调试和研究网站。

借助 Chrome DevTools,开发人员可以更深入地访问网站,并能够:

  • 检查 DOM 中的元素
  • 即时编辑元素和 CSS
  • 检查和监控网站的性能
  • 模拟用户的地理位置
  • 模拟更快/更慢的网络速度
  • 执行和调试 JavaScript
  • 查看控制台日志
  • 等等

Selenium 4 Chrome DevTools API

图片

Selenium 是支持 web 浏览器自动化的一系列工具和库的综合项目。Selenium 4 添加了对 Chrome DevTools API 的原生支持。借助这些新的 API,我们的测试现在可以:

  • 捕获和监控网络流量和性能
  • 模拟地理位置,用于位置感知测试、本地化和国际化测试
  • 更改设备模式并测试应用的响应性

这只是冰山一角!

Selenium 4 引入了新的 ChromiumDriver 类,其中包括两个方法用于访问 Chrome DevTools:getDevTools() 和 executeCdpCommand()。

getDevTools() 方法返回新的 DevTools 对象,允许您使用 send() 方法发送针对 CDP 的内置 Selenium 命令。这些命令是包装方法,使调用 CDP 函数更加清晰和简便。

executeCdpCommand() 方法也允许您执行 CDP 方法,但更加原始。它不使用包装的 API,而是允许您直接传入 Chrome DevTools 命令和该命令的参数。如果某个 CDP 命令没有 Selenium 包装 API,或者您希望以与 Selenium API 不同的方式进行调用,则可以使用 executeCdpCommand()。

像 ChromeDriver 和 EdgeDriver 这样的基于 Chromium 的驱动程序现在继承自 ChromiumDriver,因此您也可以从这些驱动程序中访问 Selenium CDP API。

让我们探索如何利用这些新的 Selenium 4 API 来解决各种使用案例。

模拟设备模式

我们今天构建的大多数应用都是响应式的,以满足来自各种平台、设备(如手机、平板、可穿戴设备、桌面)和屏幕方向的终端用户的需求。

作为测试人员,我们可能希望将我们的应用程序放置在不同的尺寸中,以触发应用程序的响应性。

我们如何使用 Selenium 的新 CDP 功能来实现这一点呢?

用于修改设备度量的 CDP 命令是 Emulation.setDeviceMetricsOverride,并且此命令需要输入宽度、高度、移动设备标志和设备缩放因子。这四个键在此场景中是必需的,但还有一些可选的键。

在我们的 Selenium 测试中,我们可以使用 DevTools::send() 方法并使用内置的 setDeviceMetricsOverride() 命令,但是这个 Selenium API 接受 12 个参数 - 除了 4 个必需的参数外,还有 8 个可选的参数。对于我们不需要发送的这 8 个可选参数中的任何一个,我们可以传递 Optional.empty()。

然而,为了简化这个过程,只传递所需的参数,我将使用下面代码中的原始 executeCdpCommand() 方法。

package com.devtools;import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.devtools.DevTools;
import java.util.HashMap;
import java.util.Map;public class SetDeviceMode {final static String PROJECT_PATH = System.getProperty("user.dir");public static void main(String[] args){System.setProperty("webdriver.chrome.driver", PROJECT_PATH + "/src/main/resources/chromedriver");ChromeDriver driver;driver = new ChromeDriver();DevTools devTools = driver.getDevTools();devTools.createSession();Map deviceMetrics = new HashMap(){{put("width", 600);put("height", 1000);put("mobile", true);put("deviceScaleFactor", 50);}};driver.executeCdpCommand("Emulation.setDeviceMetricsOverride", deviceMetrics);driver.get("https://www.google.com");}
}

在第19行,我创建了一个包含此命令所需键的映射。

然后在第26行,我调用 executeCdpCommand() 方法,并传递两个参数:命令名称为 “Emulation.setDeviceMetricsOverride”,以及包含参数的设备度量映射。

在第27行,我打开了渲染了我提供的规格的 “Google” 首页,如下图所示。

图片

借助像 Applitools Eyes 这样的解决方案,我们不仅可以使用这些新的 Selenium 命令在不同的视口上快速进行测试,还可以在规模上保持任何不一致性。Eyes 足够智能,不会对由于不同的浏览器和视口导致的 UI 中微小且难以察觉的变化报告错误的结果。

模拟地理位置

在许多情况下,我们需要测试特定的基于位置的功能,例如优惠、基于位置的价格等。为此,我们可以使用DevTools API来模拟位置。

  @Testpublic void mockLocation(){devTools.send(Emulation.setGeolocationOverride(Optional.of(48.8584),Optional.of(2.2945),Optional.of(100)));driver.get("https://mycurrentlocation.net/");try {Thread.sleep(30000);} catch (InterruptedException e) {e.printStackTrace();}}

模拟网络速度

许多用户通过连接到 Wi-Fi 或蜂窝网络的手持设备访问 Web 应用程序。遇到信号弱的网络信号,因此互联网连接速度较慢是很常见的。

在互联网连接速度较慢(2G)或间歇性断网的情况下,测试应用程序在这种条件下的行为可能很重要。

伪造网络连接的 CDP 命令是 Network.emulateNetworkConditions。关于此命令的必需和可选参数的信息可以在文档中找到。

通过访问 Chrome DevTools,就可以模拟这些场景。让我们看看如何做到这一点。

package com.devtools;import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.network.Network;
import org.openqa.selenium.devtools.network.model.ConnectionType;import java.util.HashMap;
import java.util.Map;
import java.util.Optional;public class SetNetwork {final static String PROJECT_PATH = System.getProperty("user.dir");public static void main(String[] args){System.setProperty("webdriver.chrome.driver", PROJECT_PATH + "/src/main/resources/chromedriver");ChromeDriver driver;driver = new ChromeDriver();DevTools devTools = driver.getDevTools();devTools.createSession();devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));devTools.send(Network.emulateNetworkConditions(false,20,20,50,Optional.of(ConnectionType.CELLULAR2G)));driver.get("https://www.google.com");}
}

在第21行,我们通过调用 getDevTools() 方法获取 DevTools 对象。然后,我们调用 send() 方法来启用 Network,并再次调用 send() 方法来传递内置命令 Network.emulateNetworkConditions() 和我们希望与此命令一起发送的参数。

最后,我们使用模拟的网络条件打开 Google 首页。

捕获HTTP请求

使用 DevTools,我们可以捕获应用程序发起的 HTTP 请求,并访问方法、数据、头信息等等。

让我们看看如何使用示例代码捕获 HTTP 请求、URI 和请求方法。

package com.devtools;import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.network.Network;import java.util.Optional;public class CaptureNetworkTraffic {private static ChromeDriver driver;private static DevTools chromeDevTools;final static String PROJECT_PATH = System.getProperty("user.dir");public static void main(String[] args){System.setProperty("webdriver.chrome.driver", PROJECT_PATH + "/src/main/resources/chromedriver");driver = new ChromeDriver();chromeDevTools = driver.getDevTools();chromeDevTools.createSession();chromeDevTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));chromeDevTools.addListener(Network.requestWillBeSent(),entry -> {System.out.println("Request URI : " + entry.getRequest().getUrl()+"\n"+ " With method : "+entry.getRequest().getMethod() + "\n");entry.getRequest().getMethod();});driver.get("https://www.google.com");chromeDevTools.send(Network.disable());}
}

开始捕获网络流量的 CDP 命令是 Network.enable。关于此命令的必需和可选参数的信息可以在文档中找到。

在我们的代码中,第22行使用 DevTools::send() 方法发送 Network.enable CDP 命令以启用网络流量捕获。

第23行添加了一个监听器,用于监听应用程序发送的所有请求。对于应用程序捕获的每个请求,我们使用 getRequest().getUrl() 提取 URL,并使用 getRequest().getMethod() 提取 HTTP 方法。

第29行,我们打开了 Google 的首页,并在控制台上打印了此页面发出的所有请求的 URI 和 HTTP 方法。

一旦我们完成了请求的捕获,我们可以发送 Network.disable 的 CDP 命令以停止捕获网络流量,如第30行所示。

拦截HTTP响应

为了拦截响应,我们将使用Network.responseReceived事件。当HTTP响应可用时触发此事件,我们可以监听URL、响应头、响应代码等。要获取响应正文,请使用Network.getResponseBody方法。

 @Testpublic void validateResponse() {final RequestId[] requestIds = new RequestId[1];devTools.send(Network.enable(Optional.of(100000000), Optional.empty(), Optional.empty()));devTools.addListener(Network.responseReceived(), responseReceived -> {if (responseReceived.getResponse().getUrl().contains("api.zoomcar.com")) {System.out.println("URL: " + responseReceived.getResponse().getUrl());System.out.println("Status: " + responseReceived.getResponse().getStatus());System.out.println("Type: " + responseReceived.getType().toJson());responseReceived.getResponse().getHeaders().toJson().forEach((k, v) -> System.out.println((k + ":" + v)));requestIds[0] = responseReceived.getRequestId();System.out.println("Response Body: \n" + devTools.send(Network.getResponseBody(requestIds[0])).getBody() + "\n");}});driver.get("https://www.zoomcar.com/bangalore");driver.findElement(By.className("search")).click();}

访问控制台日志

我们都依赖日志来进行调试和分析故障。在测试和处理具有特定数据或特定条件的应用程序时,日志可以帮助我们调试和捕获错误消息,提供更多在 Chrome DevTools 的控制台选项卡中发布的见解。

我们可以通过调用 CDP 日志命令来通过我们的 Selenium 脚本捕获控制台日志,如下所示。

package com.devtools;import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.log.Log;public class CaptureConsoleLogs {private static ChromeDriver driver;private static DevTools chromeDevTools;final static String PROJECT_PATH = System.getProperty("user.dir");public static void main(String[] args){System.setProperty("webdriver.chrome.driver", PROJECT_PATH + "/src/main/resources/chromedriver");driver = new ChromeDriver();chromeDevTools = driver.getDevTools();chromeDevTools.createSession();chromeDevTools.send(Log.enable());chromeDevTools.addListener(Log.entryAdded(),logEntry -> {System.out.println("log: "+logEntry.getText());System.out.println("level: "+logEntry.getLevel());});driver.get("https://testersplayground.herokuapp.com/console-5d63b2b2-3822-4a01-8197-acd8aa7e1343.php");}
}

在我们的代码中,第19行使用 DevTools::send() 来启用控制台日志捕获。

然后,我们添加一个监听器来捕获应用程序记录的所有控制台日志。对于应用程序捕获的每个日志,我们使用 getText() 方法提取日志文本,并使用 getLevel() 方法提取日志级别。

最后,打开应用程序并捕获应用程序发布的控制台错误日志。

捕获性能指标

在当今快节奏的世界中,我们以如此快的速度迭代构建软件,我们也应该迭代性地检测性能瓶颈。性能较差的网站和加载较慢的页面会让客户感到不满。

我们能够在每次构建时验证这些指标吗?是的,我们可以!

捕获性能指标的 CDP 命令是 Performance.enable。关于这个命令的信息可以在文档中找到。

让我们看看如何在 Selenium 4 和 Chrome DevTools API 中完成这个过程。

package com.devtools;import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.performance.Performance;
import org.openqa.selenium.devtools.performance.model.Metric;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class GetMetrics {final static String PROJECT_PATH = System.getProperty("user.dir");public static void main(String[] args){System.setProperty("webdriver.chrome.driver", PROJECT_PATH + "/src/main/resources/chromedriver");ChromeDriver driver = new ChromeDriver();DevTools devTools = driver.getDevTools();devTools.createSession();devTools.send(Performance.enable());driver.get("https://www.google.org");List<Metric> metrics = devTools.send(Performance.getMetrics());List<String> metricNames = metrics.stream().map(o -> o.getName()).collect(Collectors.toList());devTools.send(Performance.disable());List<String> metricsToCheck = Arrays.asList("Timestamp", "Documents", "Frames", "JSEventListeners","LayoutObjects", "MediaKeySessions", "Nodes","Resources", "DomContentLoaded", "NavigationStart");metricsToCheck.forEach( metric -> System.out.println(metric +" is : " + metrics.get(metricNames.indexOf(metric)).getValue()));}
}

首先,我们通过调用 DevTools 的 createSession() 方法创建一个会话,如第19行所示。

接下来,我们通过将 Performance.enable() 命令发送给 send() 来启用 DevTools 来捕获性能指标,如第20行所示。

一旦启用了性能捕获,我们可以打开应用程序,然后将 Performance.getMetrics() 命令发送给 send()。这将返回一个 Metric 对象的列表,我们可以通过流式处理来获取捕获的所有指标的名称,如第25行所示。

然后,我们通过将 Performance.disable() 命令发送给 send() 来禁用性能捕获,如第29行所示。

为了查看我们感兴趣的指标,我们定义了一个名为 metricsToCheck 的列表,然后通过循环遍历该列表来打印指标的值。

基本身份验证

在 Selenium 中,无法与浏览器弹出窗口进行交互,因为它只能与 DOM 元素进行交互。这对于身份验证对话框等弹出窗口构成了挑战。

我们可以通过使用 CDP API 直接与 DevTools 处理身份验证来绕过此问题。设置请求的附加标头的 CDP 命令是 Network.setExtraHTTPHeaders。

以下是在 Selenium 4 中调用此命令的方法。

package com.devtools;import org.apache.commons.codec.binary.Base64;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.network.Network;
import org.openqa.selenium.devtools.network.model.Headers;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;public class SetAuthHeader {private static final String USERNAME = "guest";private static final String PASSWORD = "guest";final static String PROJECT_PATH = System.getProperty("user.dir");public static void main(String[] args){System.setProperty("webdriver.chrome.driver", PROJECT_PATH + "/src/main/resources/chromedriver");ChromeDriver driver = new ChromeDriver();//Create DevTools session and enable NetworkDevTools chromeDevTools = driver.getDevTools();chromeDevTools.createSession();chromeDevTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));//Open websitedriver.get("https://jigsaw.w3.org/HTTP/");//Send authorization headerMap<String, Object> headers = new HashMap<>();String basicAuth ="Basic " + new String(new Base64().encode(String.format("%s:%s", USERNAME, PASSWORD).getBytes()));headers.put("Authorization", basicAuth);chromeDevTools.send(Network.setExtraHTTPHeaders(new Headers(headers)));//Click authentication test - this normally invokes a browser popup if unauthenticateddriver.findElement(By.linkText("Basic Authentication test")).click();String loginSuccessMsg = driver.findElement(By.tagName("html")).getText();if(loginSuccessMsg.contains("Your browser made it!")){System.out.println("Login successful");}else{System.out.println("Login failed");}driver.quit();}
}

我们首先使用 DevTools 对象创建一个会话,并启用 Network。这在第25-26行中展示。

接下来,我们打开我们的网站,然后创建用于发送的身份验证标头。

在第35行,我们将 setExtraHTTPHeaders 命令发送到 send(),同时发送标头的数据。这部分将对我们进行身份验证并允许我们绕过浏览器弹出窗口。

为了测试这个功能,我们点击了基本身份验证测试链接。如果您手动尝试这个操作,您会看到浏览器弹出窗口要求您进行登录。但由于我们发送了身份验证标头,所以我们的脚本中不会出现这个弹出窗口。

相反,我们会收到消息“您的浏览器登录成功!”。

总结

通过添加 CDP API,Selenium 已经变得更加强大。现在,我们可以增强我们的测试,捕获 HTTP 网络流量,收集性能指标,处理身份验证,并模拟地理位置、时区和设备模式。以及在 Chrome DevTools 中可能出现的任何其他功能!

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

在这里插入图片描述

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/138294.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC初级

文章目录 一、SpringMVC 概述二、springMVC步骤1、新建maven的web项目2、导入maven依赖3、创建controller4、创建spring-mvc.xml配置文件&#xff08;本质就是spring的配置件&#xff09;5、web.xml中配置前端控制器6、新建a.jsp文件7、配置tomcat8、启动测试 三、工作流程分析…

【Vue】如何搭建SPA项目--详细教程

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《springMvc使用》 ⛺️ 生活的理想&#xff0c;为了不断更新自己 ! 目录 1.什么是vue-cli 2.安装 2.1.创建SPA项目 2.3.一问一答模式答案 3.运行SPA项目 3…

UML活动图

在UML中&#xff0c;活动图本质上就是流程图&#xff0c;它描述系统的活动、判定点和分支等&#xff0c;因此它对开发人员来说是一种重要工具。 活动图 活动是某件事情正在进行的状态&#xff0c;既可以是现实生活中正在进行的某一项工作&#xff0c;也可以是软件系统中某个类…

【element-ui】form表单动态修改rules校验项

在项目开发过程中&#xff0c;该页面有暂存和提交两个按钮&#xff0c;其中暂存和提交必填项校验不一样&#xff0c;此时需要动态增减必填项校验 &#xff0c;解决方法如下&#xff1a; 增加rules校验项 this.$set(this.formRules,name,[{required:true,message:请输入名称,t…

润和软件HopeStage与华宇信息TAS应用中间件完成产品兼容性互认证

近日&#xff0c;江苏润和软件股份有限公司&#xff08;以下简称“润和软件”&#xff09;HopeStage 操作系统与北京华宇信息技术有限公司&#xff08;以下简称“华宇信息”&#xff09;TAS应用中间件软件完成产品兼容性测试。 测试结果表明&#xff0c;企业级通用操作系统Hope…

【Windows Server 2012 R2搭建FTP站点】

打开服务器管理器——添加角色和功能 下一步 下一步 下一步 选择FTP服务器&#xff0c;勾上FTP服务和FTP扩展&#xff0c;点击下一步 安装 安装完成关闭 打开我们的IIS服务器 在WIN-XXX主页可以看到我们的FTP相关菜单 右键WIN-XXXX主页&#xff0c;添加FTP站点 输入站点名称-FT…

前端面试手撕编程之ES+算法

目录 ES6 防抖 节流 防抖、节流应用 改变this call typeof this ! function context context || window context._this this delete context._this bind&#xff1a; return _this.apply(context, [...arguments].slice(1)); 深拷贝 !arr|| arr null || typeo…

【分布式计算】七、同步 synchronization 重难点

两个协议&#xff1a; 1、NTP&#xff08;Network Time Protocal)–>广泛使用    机器周期向时间服务器获取准确时间   2、没有协议名称 − > -> −>没有广泛使用    时间服务器周期扫描所有机器&#xff0c;计算时间平均值&#xff1b;导致时间服务器负载…

【数据结构】时间、空间复杂度

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈数据结构 &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 时间、空间复杂度 1. 算法效率3. 时…

应用程序处理:TCP模块的处理

1、应用程序处理 首先应用程序会进行编码处理&#xff0c;这些编码相当于 OSI 的表示层功能&#xff1b; 编码转化后&#xff0c;邮件不一定马上被发送出去&#xff0c;这种何时建立通信连接何时发送数据的管理功能&#xff0c;相当于 OSI 的会话层功能。 2、TCP 模块的处理 …

Acer宏碁暗影骑士5笔记本AN517-54原装出厂Win10系统工厂模式

宏基电脑原厂WINDOWS10系统自带所有硬件的驱动、NITROSENSE风扇键盘控制中心、Office办公软件、出厂主题壁纸LOGO、 Acer Care Center、Quick Access等预装程序 链接&#xff1a;https://pan.baidu.com/s/1Ovui_CvsUaF-TX0NbuhEVg?pwdcrmv 提取码&#xff1a;crmv 所需要工…

Hadoop-sqoop

sqoop 1. Sqoop简介及原理 简介&#xff1a; Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysq1.postgresql..)间进行数据的传递&#xff0c;可以将一个关系型数据库&#xff08;例如: MySQL ,Oracle ,Postgres等&#xff09;中的数据导进到Hadoop 的HDFS中&…

2、Window上的 虚拟机端口 暴露到 宿主机局域网教程

今天在公司的服务器主机上捣鼓虚拟机&#xff0c;要在虚拟机上安装一个oracle&#xff0c;虚拟机和主机能互相ping通的前提下&#xff0c;要将虚拟机上的端口号暴露在主机上&#xff0c;让项目组内的所有员工的电脑都能访问到该oracle数据库。 也就是电脑A 访问主机&#xff0…

计算机网络运维方向综合知识大全

一. 基础知识 1. 网络的组成 组成部分&#xff1a;硬件、软件、协议 硬件主要由主机&#xff08;也称端系统&#xff09;、通信链路&#xff08;如双绞线、光纤&#xff09;、交换设备&#xff08;如路由器、交换机等)和通信处理机&#xff08;如网卡)等组成。软件主要包括各种…

【SpringCloud】微服务技术栈入门1 - 远程服务调用、Eureka以及Ribbon

目录 远程服务调用RestTemplate Eureka简要概念配置 Eureka 环境设置 Eureka ClientEureka 服务发现 Ribbon工作流程配置与使用 Ribbon饥饿加载 远程服务调用 RestTemplate RestTemplate 可以模拟客户端来向另外一个后端执行请求 黑马给出的微服务项目中&#xff0c;有两个 …

【深度学习实验】前馈神经网络(六):自动求导

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 标量求导 2. 矩阵求导 3. 计算图 一、实验介绍 PyTorch提供了自动求导机制&#xff0c;它是PyTorch的核心功能之一&#xff0c;用于计算梯度并进行反向传播。自动求…

使用Java将PPT、PPTX和PDF转换为图片

从Office到图片—使用Java实现文件格式转换 PDF转图片1. 万事第一步2. 撸代码 PPT/PPTX转图片1. 万事第一步2. 撸代码验收一下 最近小雨遇到了一个需求&#xff0c;需要在前端小程序中嵌入展示Office文件的功能。然而&#xff0c;前端使用开源组件进行在线预览会导致性能消耗较…

windows下gvim的配置

一、vim配置文件 "查看自己的vimrc所在的目录 "在命令模式下 :echo $MYVIMRC"打开自己的vimrc文件 "在命令模式下 :e $MYVIMRC 二、排版 "查看自己当前的字体及大小 "在命令模式下 :set guifont?"设置默认的字体为仿宋_GB2312&#xff…

IDEA 2019 Springboot 3.1.3 运行异常

项目场景&#xff1a; 在IDEA 2019 中集成Springboot 3.1.3 框架&#xff0c;运行异常。 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSch…

R语言贝叶斯广义线性混合(多层次/水平/嵌套)模型GLMM、逻辑回归分析教育留级影响因素数据...

全文下载链接&#xff1a;http://tecdat.cn/?p24203 本教程使用R介绍了具有非信息先验的贝叶斯 GLM&#xff08;广义线性模型&#xff09; &#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 当前教程特别关注贝叶斯逻辑回归在二元结果和计数/比例结果场景中的…