Xpath元素定位和三大等待,三大切换

在页面的操作过程当中,都需要适当的等待。特别是: 候【发生了页面切换的时候】。而我们接下来的操作都是在变化的内容上。 代码就要等等页面的加载,等等页面的渲染。代码是非常快的,页面加载跟不 上,就需要等待。

三大等待

面试题:selenium的等待方式有哪些?隐性和显性的区别是什 么?

隐式等待:

1、如果超过隐式等待的设置时间还是找不到元素,就会抛出了 NoSuchElementException-找不到元素异常

2、全局生效,只需要设置一次,之后通过find_element去找元素都会有隐 式等待的效果

3、放置的位置,一般我们会将其放置到driver的初始化之后

4、等待条件的区别,只能等待元素存在这一个条件

显式等待

1、如果超过显式等待的设置时间还是找不到元素,就会抛出了 TimeoutException-超时异常

2、局部生效的,只能针对单个元素生效

3、设置的时候是针对单个元素的,并不是全局的

5、等待更多丰富的条件:等待元素可见、可被点击、等待元素存在...

等待的方式有三种:强制等待,隐形等待,显性等待。

1、sleep(秒) -- 强制等待

  • 优点:使用简单
  • 缺点:等待时间把握不准,容易造成时间浪费或者等待时间不足
    # import time
    from time import sleep
    from selenium import webdriver
    from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('https://www.baidu.com')
    driver.find_element(By.ID,'kw').send_keys('菜鸟教程')
    driver.find_element(By.ID,'su').click()
    # 代码速度太快了,页面加载需要时间,让我们代码等待一会儿
    # time.sleep(2)
    sleep(2)
    driver.find_element(By.PARTIAL_LINK_TEXT,' - 学的不仅是技术,更是梦想!').click()
    sleep(3)
    driver.quit()

2、智能等待

-- 在指定的时间内,什么时候【条件】成立了,什么时候就不等了。

2.1 隐性等待: driver.implicitly_wait(超时时长-秒)
  • 条件:等待一个元素被找到。 找元素都是从html当中去找。find_element, 在html当中是存在的。
  • 特征:在一个浏览器会话当中只需要被调用一次,所有的find_element都 可以应用。
    """
    智能等待:
    driver.implicitly_wait() : 括号里写上最长等待时间"""
    # import time
    from time import sleep
    from selenium import webdriver
    from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
    # 隐式等待
    driver.implicitly_wait(15)
    driver.maximize_window()
    driver.get('https://www.baidu.com')
    driver.find_element(By.ID,'kw').send_keys('菜鸟教程')
    driver.find_element(By.ID,'su').click()
    # 代码速度太快了,页面加载需要时间,让我们代码等待一会儿
    driver.find_element(By.PARTIAL_LINK_TEXT,' - 学的不仅是技术,更是梦想!').click()driver.quit()

如果超时时长以内没有找着元素,就会抛异常:NosuchElementException的找不到元素的异常。

  • 优点:全局应用,它适用于WebDriver会话期间中所有查找的Web元素 (通过findelement方法)
  • 缺点:它只支持单一条件:元素存在;只能等待元素存在,不能适用条件 更复杂的情况,如:元素可点击、元素可见
2.2 显性等待: 多个条件 + 等待时长 ==条件更多,更加丰富,更符合我们工作 中的场景
"""
智能等待:
driver.implicitly_wait() : 括号里写上最长等待时间"""# import time
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.baidu.com')
driver.find_element(By.ID,'kw').send_keys('菜鸟教程')
driver.find_element(By.ID,'su').click()
# 代码速度太快了,页面加载需要时间,让我们代码等待一会儿
# 显性等待
# 元素定位表达是元组的格式
loc = (By.PARTIAL_LINK_TEXT,' - 学的不仅是技术,更是梦想!')
# 最长等待8s 直到元素可以被点击了 才会结束等待执行后面的操作。 如果一直不可点击,timeout报错。
WebDriverWait(driver,8).until(EC.element_to_be_clickable(loc)).click()
# driver.quit()
# 既然显示等待每个元素都会用,所以封装,多次调用。

条件很多,常见的几种如下:

  • presence_of_element_located(元组/列表) :给定的元素存在
  • visibility_of_element_located(元组/列表) :给定的元素可见
  • element_to_be_clickable(元组/列表) : 给定的元素可点击。

元素存在/可见/可用的区别: 元素存在< 可见< 可用

  • 元素的存在: 能find_element就可以了。如果存在但不可见,是可以获 取元素属性的,但是不能够对元素进行操作。
  • 元素的可见: 在存在的基础上,元素在页面上大小>0,即在页面上显示出 来了 肉眼可见。
    • - 比如百度页面上的设置按钮,鼠标悬浮上去才会显示菜单,那么默认 情况下 这个元素是不可见的:
    • - style='display:None'; 不可见,这个元素是存在但是不可见。
    • - style='display:block' 元素展示出来了,可见。
  • 元素的可用:在可见的基础上,能够使用其原始功能,
    • 比如可点击,可输 入等 - 比如按钮可点击即可用,不可点击即不可用。输入框可输入即可用, 不可输入即不可用。下拉列表可以选可用

注意:条件的参数必须要是元组或者列表的类型的:(元素定位的方法,元素 定位表达式)

  • WebDriverWait(driver, 超时时间, 轮询周期默认0.5).until(条件) 直到条件 成立
  • WebDriverWait(driver, 超时时间, 轮询周期默认0.5).until_not(条件) 直到 条件不成立
  • 局部生效,哪里需要等待哪里就要调用,生效只有一次。
  • 如果超时时长以内没有找着元素,就会抛异常: TimeoutException,超时 异常
  • 优点:可以设置更加丰富的特定条件
  • 缺点:仅对指定的元素生效,代码略复杂

问题: 显示等待和隐式等待能够一起混用么?

最好不要混合一起使用,容易引起一些问题。所以,尽量不要混用。官方有说 明。在一个会话周期里不要混用。

selenium官方文档说明:

Waiting Strategies | Selenium

在项目里更多的时候是不同的等待策略的结合,比如隐式+强制等待 or 显式等 待【为主】+ 强制等待【为辅】(用的比较多),不会混用隐式+显式。

  • 如果只用了智能等待,依然不生效的时候,会配合强制等待使用。后面项 目里会有这样的场景。
  • 后面的框架会进行封装,显示等待在封装好关键字,后面重复调用就可以

三大切换

经典面试题: 元素报错找不到可能的原因有哪些?

1、窗口切换

当我们点击了 a 标签元素(超链接)时,会触发打开链接页面的事件,有两种 情形:

  • 1、在当前窗口加载新页面内容
  • 2、新建一个窗口加载新页面内容,这种情况在 a 标签有 target="_blank" 时触发。

当发生第2种情况时,我们需要切换窗口。在新的窗口里定位元素。

driver.current_window_handle(); #获取当前操作窗口的句柄
driver.window_handles(); #获取所有打开的窗口句柄

切换的步骤:

1)执行打开新窗口的操作

2)获取现在所有的窗口句柄。

  • 窗口列表 : wins = driver.window_handles ,结果是个列表,最新的窗 口在列表的最后。
    • 新打开的窗口追加在窗口列表末尾。
    • 通过索引进行选择: wins[-1]获取最新的窗口

3)切换到最新窗口:driver.switch_to.window(窗口列表[-1])

  • 切换窗口-参数windowname(窗口的名字 也就是窗口句柄)
  • 需要注意,窗口的句柄并不是固定的,而是由浏览器分配的,类似于进 程号: 窗口句柄是唯一,但是并不固定 ,所以不能直接写死进行切 换。
  • 需要通过获取到所有句柄后的列表 取值。
单窗口切换
"""
点击链接 打开了新窗口 要在新窗口里定位元素, 一定要切换窗口。
driver.window_handles : 拿到所有窗口句柄 放在列表里。- 句柄唯一的 但是是变化  不能直接用句柄本身去做窗口切换- 既然是放在列表里,可以用列表的索引去切换 , 最新窗口一定是最后一个:[-1]"""
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleepdriver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.baidu.com')# 打开新的窗口之前 先获取所有的窗口句柄
wins = driver.window_handles
print(wins)
# 找到贴吧的链接
driver.find_element(By.LINK_TEXT,"贴吧").click()# 打开新的窗口之后 获取所有句柄
wins = driver.window_handles
print(wins)# 切换到最新的窗口
driver.switch_to.window(wins[-1])# 在贴吧的页面里输入文本 搜索 test == 切换成功之后,就看可以在新的页面里进行元素操作了
driver.find_element(By.NAME,"kw1").send_keys("test")
多窗口切换
"""
点击链接 打开了新窗口 要在新窗口里定位元素, 一定要切换窗口。
driver.window_handles : 拿到所有窗口句柄 放在列表里。- 句柄唯一的 但是是变化  不能直接用句柄本身去做窗口切换- 既然是放在列表里,可以用列表的索引去切换 , 最新窗口一定是最后一个:[-1]"""
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleepdriver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.baidu.com')# 找到贴吧的链接
driver.find_element(By.LINK_TEXT,"新闻").click()
driver.find_element(By.LINK_TEXT,"图片").click()
driver.find_element(By.LINK_TEXT,"贴吧").click()# 打开新的窗口之后 获取所有句柄
wins = driver.window_handles
print(wins)# driver.switch_to.window(wins[-1]) # 切换到最新的窗口
# driver.switch_to.window(wins[-2]) # 切换到最新的窗口,用索引且会有问题。可以采用列表遍历
# for循环遍历一下列表 拿到每一个句柄 然后切换  判断一下 url title
for win in wins:if driver.current_url == "https://image.baidu.com/": # 判断当前的页面是否为想要的url地址breakelse:driver.switch_to.window(win)  # 如果不是 继续切换# 切换的不是最新的一个 -- 中间的图片
driver.find_element(By.XPATH,"//span[@class='input-container_94h2R']/input").send_keys("图片")
driver.find_element(By.XPATH,"//input[@value='百度一下']").click()# # 在贴吧的页面里输入文本 搜索 test == 切换成功之后,就看可以在新的页面里进行元素操作了
# driver.find_element(By.NAME,"kw1").send_keys("test贴吧")

2、iframe切换

有些时候我们明明元素定位方式是对的,也加了等待,就是代码运行报错找不 到元素。就算加个等待也依然找不到元素,但是也没有发生窗口切换。这个时 候就检查一下是否存在子页面--iframe。

  • iframe是什么?
    • iframe里面放的是另外一个html页面。页面嵌套
    • driver.find_element的时候,只在当前所在的html当中找元素,不可以跨 html的。

所以,如果我们要操作iframe当中html里的元素,那么必须先切换到iframe当 中的html当中去。

如何确认页面是否有iframe的步骤

  • 第一个就是:你明确元素定位正确且等待到位,依然找不到元素,那么有 可能就是在iframe当中。 第二个就是:在元素定位的时候,查看上方的绝对路径链接,如果其中有2 个html,那就说明在iframe当中

iframe切换的方法:driver.switch_to.frame(有3种方式)

第一种:通过iframe的name或者id属性切换: 【QQ空间案例】
  • driver.switch_to.frame("login_frame")
  • 注意: 如果id是变化的,也是不可以用于定位的,要换定位方法进 行定位; 如何确认是变化的,有数字+刷新确认。| 没有id和name 属性,也需要换方法定位并切换。
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from time import sleepdriver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('https://qzone.qq.com/')# 切换iframe: 1、有id 和name 直接切换
    driver.switch_to.frame("login_frame")# 点击密码登录link --在iframe子页面里 需要先进行iframe切换
    driver.find_element(By.ID,'switcher_plogin').click()
    driver.find_element(By.ID,'u').send_keys("test123")
    driver.find_element(By.ID,'p').send_keys("test123")sleep(2)
    driver.close()

第二种:识别你要操作的元素是不是在iframe当中 【126.com案例】
# 切换iframe: 使用元素定位方式定位到iframe元素,再切换。
iframe =
driver.find_element(By.XPATH,'//iframe[contains(@id,"x-URSiframe")]')
driver.switch_to.frame(iframe)

切换到iframe当中的html,再去进行元素定位和操作,就跟普通的html一样 的。

退出iframe

切到子页面里,有时候需要退回到主页面里定位,就需要退出iframe:

  • driver.switch_to.default_content() --- 跳出iframe,回到默认的html当 中。如果有多层页面嵌套,一下回到最外层页面。
  • driver.switch_to.parent_frame() : 回到父级页面中,只能一级一级的跳出

注意:一个主页面可能会存在多个iframe子页面,要进去另外一个 iframe,就需要先退出 再进去另外一个。

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleepdriver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://126.com/')# 切换iframe- id是变化的 不能直接使用id切换 需要进行元素定位 再切换
iframe_ele = driver.find_element(By.XPATH,'//iframe[contains(@id,"x-URS-iframe")]')
driver.switch_to.frame(iframe_ele)  # iframe切换# 点击密码登录link --在iframe子页面里 需要先进行iframe切换
driver.find_element(By.XPATH,'//input[@name="email"]').send_keys("test321456")
driver.find_element(By.NAME,'password').send_keys("test123")
sleep(2)# 切换回主页面  进行元素定位 - 一次性回到最原始页面
driver.switch_to.default_content()
sleep(2)
driver.find_element(By.ID,'navDlAppBtn').click() # 点击主页面的 手机app下载按钮sleep(2)
driver.close()

3、弹窗切换

【alert(警告消息框),confirm(确认消息框), prompt(提示消息对话框) 】

如果页面发生了弹窗,要点击弹窗元素,也要进行弹窗切换,不然定位不到元 素。

弹窗有三种不同类型:alert(警告消息框)、confirm(确认消息框)、 prompt(提示消息对话框) 弹

  • 通过switch_to.alert()切换到弹窗
  • 再使用accept、dismiss、send_keys、text方法进行操作

1)alert弹框: 本质上是js的弹框 ,需要切换后将它关掉。 ==最常见 优先掌 握

  • 弹框出现后,要点击确认才会消失。
  • 操作:
    • accept(): 点击确定 text: 获取弹框文本
    • text: 获取弹框文本
      #1、 alert弹框: 本质上是js的弹框 ,需要切换后将它关掉。 ==最常见 优先掌握
      from selenium import webdriver
      from selenium.webdriver.common.by import By
      from time import sleepdriver = webdriver.Chrome()
      driver.maximize_window()
      driver.get('file:///D:/BaiduNetdiskDownload/66%E6%9C%9F%E8%87%AA%E5%8A%A8%E5%8C%96/%E6%96%87%E6%A1%A3%E8%B5%84%E6%96%99/20240311_py66%E7%AC%AC%E4%BA%8C%E5%8D%81%E4%BA%94%E8%8A%82%E8%AF%BE_%E4%B8%89%E5%A4%A7%E7%AD%89%E5%BE%85%E5%92%8C%E4%B8%89%E5%A4%A7%E5%88%87%E6%8D%A2/%E5%BC%B9%E7%AA%97%E4%B8%8B%E6%8B%89%E6%A1%86demo.html')
      sleep(2)  # 强制等待# 点击触发弹框
      driver.find_element(By.ID,'alert').click()# 切换到弹框 并进行操作
      print(driver.switch_to.alert.text) # 获取弹框文本 并打印
      driver.switch_to.alert.accept() # 进行确认操作 关闭弹框sleep(2)
      driver.close()

2)confirm(确认消息框): 确认和取消两个选项,可以有如下操作:

  • dismiss(): 点击取消
  • accept(): 点击确定
  • text: 获取弹框文本
    #1、 alert弹框: 本质上是js的弹框 ,需要切换后将它关掉。 ==最常见 优先掌握
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from time import sleepdriver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('file:///D:/BaiduNetdiskDownload/66%E6%9C%9F%E8%87%AA%E5%8A%A8%E5%8C%96/%E6%96%87%E6%A1%A3%E8%B5%84%E6%96%99/20240311_py66%E7%AC%AC%E4%BA%8C%E5%8D%81%E4%BA%94%E8%8A%82%E8%AF%BE_%E4%B8%89%E5%A4%A7%E7%AD%89%E5%BE%85%E5%92%8C%E4%B8%89%E5%A4%A7%E5%88%87%E6%8D%A2/%E5%BC%B9%E7%AA%97%E4%B8%8B%E6%8B%89%E6%A1%86demo.html')
    sleep(2)  # 强制等待# 点击触发弹框
    driver.find_element(By.ID,'confirm').click()# 切换到弹框 并进行操作
    print(driver.switch_to.alert.text) # 获取弹框文本 并打印
    driver.switch_to.alert.accept() # 进行确认操作 关闭弹框
    driver.find_element(By.ID,'confirm').click()
    driver.switch_to.alert.dismiss() # 进行取消操作 关闭弹框sleep(2)
    driver.close()

3)prompt(提示消息对话框),可以输入内容。 有如下四种操作:

  • dismiss(): 点击取消
  • accept(): 点击确定
  • text: 获取框中的文本
  • send_keys(): 输入文本

注意: prompt输入文本,chrome浏览器不支持,Firefox支持,chrome浏览 器的驱动bug

#1、 alert弹框: 本质上是js的弹框 ,需要切换后将它关掉。 ==最常见 优先掌握
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleepdriver = webdriver.Chrome()
driver.maximize_window()
driver.get('file:///D:/BaiduNetdiskDownload/66%E6%9C%9F%E8%87%AA%E5%8A%A8%E5%8C%96/%E6%96%87%E6%A1%A3%E8%B5%84%E6%96%99/20240311_py66%E7%AC%AC%E4%BA%8C%E5%8D%81%E4%BA%94%E8%8A%82%E8%AF%BE_%E4%B8%89%E5%A4%A7%E7%AD%89%E5%BE%85%E5%92%8C%E4%B8%89%E5%A4%A7%E5%88%87%E6%8D%A2/%E5%BC%B9%E7%AA%97%E4%B8%8B%E6%8B%89%E6%A1%86demo.html')
sleep(2)  # 强制等待# 点击触发弹框
driver.find_element(By.ID,'prompt').click()# 切换到弹框 并进行操作
print(driver.switch_to.alert.text) # 获取弹框文本 并打印
driver.switch_to.alert.send_keys("输入文本")
# 注意: prompt输入文本,chrome浏览器不支持,Firefox支持,chrome浏览器的驱动bug
driver.switch_to.alert.accept() # 进行确认操作 关闭弹框
sleep(2)
driver.find_element(By.ID,'prompt').click()
driver.switch_to.alert.dismiss() # 进行取消操作 关闭弹框
sleep(2)
driver.close()

面试题:如果元素定位不到,有哪些原因??【 no such element 如何排查】

  • 1、检查我们的元素定位表达式是否写错,可以F12搜索验证
  • 2、检查是否是需要加等待: 智能等待+ 强制登录结合使用
  • 3、检查是否元素在iframe中,如果是的话就需要切换iframe
  • 4、检查元素是否在新的窗口中,如果是的话我们就需要切换窗口
  • 5、是否元素不可见,先移动鼠标或者其他操作让你可见后再操作 -- 操作鼠标
  • 6、是否无法直接操作,可以通过js 点击 或者键鼠操作等。 -- js点击

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

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

相关文章

getaway基本配置

Getaway 是一款用于容器化应用的轻量级 API 网关。它提供了一种简单的方式来管理和路由 API 请求&#xff0c;通常用于微服务架构中。以下是 Getaway 的基本配置指南&#xff0c;包括安装、配置文件示例、以及一些常见的配置选项。 ### 1. 安装 Getaway 通常通过 Docker 容器…

用友开发平台调用审核提示U8授权失败可能原因

U8授权失败可能有多种原因&#xff0c;这里有几个可能的解决方案供您参考&#xff1a; 登录接口未调用&#xff1a;在调用审核接口&#xff08;如audit、abandon、verify、unverify&#xff09;之前&#xff0c;请确保已经调用了登录接口&#xff08;login&#xff09;。如果登…

红队攻防渗透技术实战流程:云安全之云原生安全:K8s安全

红队云攻防实战 1.云原生-K8s安全-名词架构&各攻击点1.1 云原生-K8s安全-概念1.2 云原生-K8s安全-K8S集群架构解释1.2.1 K8s安全-K8S集群架构-Master节点1.2.2 K8s安全-K8S集群架构-Node节点1.2.3 K8s安全-K8S集群架构-Pod容器1.3 云原生安全-K8s安全-K8S集群攻击点 `(重点…

ARP基本原理

相关概念 ARP报文 ARP报文分为ARP请求报文和ARP应答报文&#xff0c;报文格式如图1所示。 图1 ARP报文格式 Ethernet Address of destination&#xff08;0–31&#xff09;和Ethernet Address of destination&#xff08;32–47&#xff09;分别表示Ethernet Address of dest…

【算法】前缀和——除自身以外数组的乘积

本节博客是用前缀和算法求解“除自身以外数组的乘积”&#xff0c;有需要借鉴即可。 目录 1.题目2.前缀和算法3.变量求解4.总结 1.题目 题目链接&#xff1a;LINK 2.前缀和算法 1.创建两个数组 第一个数组第i位置表示原数组[0,i-1]之积第二个数组第i位置表示原数组[i1,n-1]…

laravel8 JWT配置

一、安装JWT composer require tymon/jwt-auth二、config/app.php 注册服务提供者 providers > [Tymon\JWTAuth\Providers\LaravelServiceProvider::class, ]aliases > [JWTAuth > Tymon\JWTAuth\Facades\JWTAuth::class,JWTFactory > Tymon\JWTAuth\Facades\JWT…

Hadoop 客户端 FileSystem加载过程

如何使用hadoop客户端 public class testCreate {public static void main(String[] args) throws IOException {System.setProperty("HADOOP_USER_NAME", "hdfs");String pathStr "/home/hdp/shanshajia";Path path new Path(pathStr);Confi…

AWS安全性身份和合规性之Amazon Detective

分析和直观呈现安全数据&#xff0c;以调查潜在的安全问题。 Amazon Detective使您可以更轻松地分析、调查和快速确定潜在安全问题或可疑活动的根本原因。Amazon Detective会自动从您地AWS资源中收集日志数据并使用机器学习、统计分析和图论来构建一组关联的数据&#xff0c;使…

在DAYU200上实现OpenHarmony跳转拨号界面

一、简介 日常生活中&#xff0c;打电话是最常见的交流方式之一&#xff0c;那么如何在OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&#xff09;中进行电话服务相关的开发呢&#xff1f;今天我们可以一起来了解一下如何通过电话服务系统支持的API实现拨打电话的功能…

ECMAScript 详解

ECMAScript 是一种脚本语言规范&#xff0c;由欧洲计算机制造商协会&#xff08;ECMA&#xff09;通过 ECMA-262 标准化&#xff0c;广泛用于客户端脚本编程。它最著名的实现是 JavaScript&#xff0c;主要用于 Web 开发。以下是 ECMAScript 的详细解析&#xff1a; ### 1. 历…

C#中System.Threading.Timer的使用

文章速览 概述创建计时器对象循环执行的方法停止计时器参考文章 坚持记录实属不易&#xff0c;希望友善多金的码友能够随手点一个赞。 共同创建氛围更加良好的开发者社区&#xff01; 谢谢~ 概述 本文着重于System.Threading.Timer的简单使用方法。 由于在实际开发过程中&…

LabVIEW机械臂自动化在精密制造中的应用

精密制造是现代工业中的关键环节&#xff0c;要求高精度、高效率以及一致性。机械臂自动化技术结合LabVIEW软件&#xff0c;提供了强大的控制、数据处理和用户界面设计能力&#xff0c;使其在精密制造中得到了广泛应用。以下是几个具体的应用实例&#xff1a; 1. 电路板焊接 …

C#-根据日志等级进行日志的过滤输出

文章速览 概要具体实施创建Log系统动态修改日志等级 坚持记录实属不易&#xff0c;希望友善多金的码友能够随手点一个赞。 共同创建氛围更加良好的开发者社区&#xff01; 谢谢~ 概要 方便后期对软件进行维护&#xff0c;需要在一些关键处添加log日志输出&#xff0c;但时间长…

【408精华知识】指令周期的数据流

文章目录 一、取指周期二、间址周期三、执行周期&#xff08;一&#xff09;数据传送类指令(mov/load/store)&#xff08;二&#xff09;运算类指令(加/减/乘/除/移位/与/或)&#xff08;三&#xff09;转移类指令(jmp/jxxx) 四、中断周期 CPU每取出并且执行一条指令所需要的全…

二叉数之插入操作

首先是题目 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 注意&#xff0c;可能存在多种有效…

AcWing 217:绿豆蛙的归宿 ← 搜索算法

【题目来源】https://www.acwing.com/problem/content/219/【题目描述】 给出一个有向无环的连通图&#xff0c;起点为 1&#xff0c;终点为 N&#xff0c;每条边都有一个长度。 数据保证从起点出发能够到达图中所有的点&#xff0c;图中所有的点也都能够到达终点。 绿豆蛙从起…

thinkphp 使用模型实现多表连接查询

解决问题&#xff0c;多张表的查询连接问题&#xff0c;3张表及以上 爷爷表 有字段id 爸爸表 有字段id&#xff0c;grandfather_id 儿子表 id,parent_id 控制器中编写 public function getdata(){ $data model(爷爷表)->with([father.son])->select(); var_dump($data…

Kreon: An Efficient Memory-Mapped Key-Value Store for Flash Storage——论文泛读

TOS 2021 Paper 论文阅读笔记整理 问题 持久的键值存储已经成为现代数据处理系统的数据访问路径中的一个主要组件。然而&#xff0c;它们表现出较高的CPU和I/O开销。 基于LSM Tree的键值存储中两个重要的CPU和I/O开销来源是&#xff1a; 在LSM Tree中使用压缩&#xff0c;不…

若依解决使用https上传文件返回http路径问题

若依通过HTTPS请求进行文件上传时却返回HTTP的文件链接地址&#xff0c;主要原因是使用了 request.getRequestURL 获取链接地址。 解决办法&#xff1a; 在nginx配置文件location处加上&#xff1a;proxy_set_header X-Forwarded-Scheme $scheme; 然后代码通过request.getHea…

MobaXterm下载虚拟机SSH链接超时解决(保姆级踩坑)

文章目录 为啥要用MobaXtermMobaXterm下载打开虚拟机ssh链接ssh连接失败排查linux配置windows配置 到这了&#xff0c;什么都干了&#xff0c;怎么还不成功&#xff1f; 更多相关内容可查看 在一个阳光明媚的下午&#xff0c;开启了无限踩坑的旅程 为啥要用MobaXterm 作为小编…