Selenium with Python学习笔记整理(网课+网站持续更新)

news2024/11/15 10:47:52

本篇是根据学习网站和网课结合自己做的学习笔记,后续会一边学习一边补齐和整理笔记

官方学习网站在这获取:

https://selenium-python.readthedocs.io/getting-started.html#simple-usage

WEB UI自动化环境配置

(推荐靠谱的博客文章来进行环境配置,具体的我就不写了)

下载和安装 Python+下载和安装 PyCharm+安装 Selenium 库+下载浏览器驱动程序:

具体操作还得是看这两篇文章:

Selenium web UI自动化测试简介与环境搭建_selenium webui-CSDN博客

PyCharm 搭建 Selenium + Python 的自动化测试环境_pycharm自动化测试-CSDN博客

然后安装selenium的时候出现了安装不成功的问题,那就参考这篇文章:

安装selenium(超级详细)_selenium安装-CSDN博客

Chorme Driver安装链接在这,非常全了:

Chrome for Testing availability (googlechromelabs.github.io)

Anaconda安装教程参考这篇很实用:

Anaconda安装教程傻瓜教程_anaconda下没有usr目录-CSDN博客

定位元素

eg:拿测试百度网页来看:

 通过ID定位

在网页上通过 ID 定位一个元素(通常是一个输入框),然后向这个输入框中输入 "Selenium",最后打印出这个输入框的当前值。

# 1. By ID - 定位搜索输入框
    search_box_by_id = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "kw"))
    )
    search_box_by_id.send_keys("Selenium")  # 在输入框中输入"Selenium"
    print("Located by ID:", search_box_by_id.get_attribute("value"))
  1. WebDriverWait(driver, 10):

    • 这个部分表示对 driver(Selenium 的浏览器控制对象)进行最多 10秒 的等待时间。Selenium 中有隐式和显式等待,此处使用的是显式等待即在指定时间内等待某个条件满足。
  2. until(EC.presence_of_element_located((By.ID, "kw"))):

    • until 方法的作用是在指定的条件被满足前一直等待,或者直到超时。这里的条件是EC.presence_of_element_located,它会等待页面上某个元素(通过指定的定位方法,如ID)被找到并存在。
    • (By.ID, "kw") 表示通过 ID 属性定位页面上的元素,ID 的值是 "kw"。这个ID通常用于唯一标识页面中的某个元素。
  3. search_box_by_id.send_keys("Selenium"):

    • send_keys 方法用于在找到的输入框中模拟键盘输入。这里它向页面上的搜索框输入了 "Selenium" 这个字符串。
  4. print("Located by ID:", search_box_by_id.get_attribute("value")):

    • get_attribute("value") 是获取输入框当前的值。它会打印出输入框中已经填入的内容,以确认 "Selenium" 已经正确输入。

 按名称定位 

通过 Name 或 ID 属性定位页面上的搜索按钮(最终是通过 ID "su" 定位),并模拟点击操作。

   # 2. By Name - 定位搜索按钮
    # 定位搜索按钮(名称为wd),并点击按钮(百度按钮的ID实际为su,所以切换成用ID定位)。
    search_button_by_name = driver.find_element(By.NAME, "wd")
    search_button_by_name = driver.find_element(By.ID, "su")  # 百度搜索按钮的ID为 "su"
    search_button_by_name.click()
    print("Located by Name: 搜索按钮点击成功")
  1. search_button_by_name = driver.find_element(By.NAME, "wd"):

    • 尝试通过按钮的 Name 属性来定位搜索按钮。find_element(By.NAME, "wd") 意思是寻找网页中 name 属性为 "wd" 的元素。但百度的搜索按钮并没有这个 name 属性,因此这段代码应该是示例中的注释部分,可能是最初的尝试。
  2. search_button_by_name = driver.find_element(By.ID, "su"):

    • 由于百度的搜索按钮的实际ID为 "su",所以在这里使用 ID 来重新定位元素。find_element(By.ID, "su") 表示通过元素的 ID(即 "su")来找到这个元素。
  3. search_button_by_name.click():

    • click() 方法用于模拟用户点击该按钮。这意味着一旦找到搜索按钮,Selenium 将自动执行点击操作,触发搜索功能。

按类名查找元素

输出该元素的 class 属性值,以确认定位是否正确。

 # 3. By Class Name - 定位搜索输入框的父级容器
    parent_div_by_class_name = driver.find_element(By.CLASS_NAME, "s_form")
    print("Located by Class Name:", parent_div_by_class_name.get_attribute("class"))

Class Name 是 HTML 元素的一个属性,用于标识多个元素共享的样式或功能,因此使用 Class Name 可以选择某些具有相同特征的元素。

按标签名称定位元素 

输出找到的链接数量,方便确认是否正确定位了页面上的所有链接。

    # 4. By Tag Name - 定位所有链接
    all_links_by_tag_name = driver.find_elements(By.TAG_NAME, "a")
    print(f"Located by Tag Name: 找到 {len(all_links_by_tag_name)} 个链接")
  1. all_links_by_tag_name = driver.find_elements(By.TAG_NAME, "a"):

    • 这行代码通过 TAG_NAME 定位页面中的所有 <a> 标签。find_elements(By.TAG_NAME, "a") 方法会返回一个包含所有链接元素的列表(每个链接都是由 <a> 标签定义的)。
    • 这里的 find_elements 返回多个元素,因此用 find_elements 而不是 find_element。即使页面上有多个 <a> 标签,它也可以找到并返回所有的链接元素。
  2. print(f"Located by Tag Name: 找到 {len(all_links_by_tag_name)} 个链接"):

    • len(all_links_by_tag_name) 获取 all_links_by_tag_name 列表的长度,也就是找到的 <a> 标签的数量。
    • 使用 f-string 格式化输出信息,将找到的链接数量插入到打印语句中,向用户反馈已经定位到多少个链接。

通过 XPath 定位

  • 通过 XPath 精确定位页面中的百度新闻链接,确保链接的 href 和 class 属性满足指定条件。
  • 使用 显式等待 确保在指定的时间内,等待元素的加载,适应动态网页。
  # 5.使用XPath来进行定位元素 定位新闻
    # CSSSelector中的href属性值需要使用引号包围
    news_link_by_xpath = WebDriverWait(driver, 20).until(
        EC.presence_of_element_located(
            (By.XPATH, "//a[@href='http://news.baidu.com' and @class='mnav c-font-normal c-color-t']")
        )
    )
  1. WebDriverWait(driver, 20).until(...):

    • WebDriverWait 是 Selenium 提供的显式等待方法,用于等待某个条件成立。在这里,我们告诉 Selenium 最多等待 20 秒,直到元素被定位并可用为止。
    • 显式等待 是在特定条件下使用的,它可以等待某个元素出现或某个状态完成,适用于动态加载的页面。
  2. EC.presence_of_element_located(...):

    • EC 是 expected_conditions 的缩写。presence_of_element_located 表示等待某个元素在 DOM 中存在,但不一定可见。这里通过 XPath 指定我们要寻找的元素。
  3. By.XPATH 和 XPath 表达式:

    • By.XPATH 指定使用 XPath 定位元素。XPath 是一种用于查找 XML 或 HTML 文档中特定元素的路径语言,特别适合用于复杂结构或需要多条件筛选的情况。
    • "//a[@href='http://news.baidu.com' and @class='mnav c-font-normal c-color-t']"
      • //a:表示在整个页面中查找 <a> 标签(链接元素)。
      • [@href='http://news.baidu.com']:指定 href 属性值必须是 "http://news.baidu.com",也就是指向百度新闻的链接。
      • [@class='mnav c-font-normal c-color-t']:指定 class 属性必须为 'mnav c-font-normal c-color-t',确保只选择特定样式的链接。

通过链接文本查找超链接 

  • 通过部分链接文本定位包含“视频”一词的链接,并打印出该链接的完整文本。
  • 适合用于无法预知链接的完整文本,但知道部分文本的场景。
    # 6. By Partial Link Text - 定位部分文本包含"视频"的链接
    video_link_by_partial_link_text = driver.find_element(By.PARTIAL_LINK_TEXT, "视频")
    print("Located by Partial Link Text:", video_link_by_partial_link_text.text)
  1. driver.find_element(By.PARTIAL_LINK_TEXT, "视频"):

    • 这个方法使用 Partial Link Text 定位页面中的链接。By.PARTIAL_LINK_TEXT 允许通过部分链接文本进行定位,而不要求完整匹配链接文本。
    • 这里寻找的是文本部分包含 “视频” 的链接(<a> 标签)。它只需要链接文本中含有 “视频” 这两个字,就可以定位到对应的元素。
    • find_element 方法返回页面中第一个匹配的元素对象。
  2. video_link_by_partial_link_text.text:

    • text 属性用于获取找到的链接元素的可见文本。在这个例子中,video_link_by_partial_link_text.text 会返回链接的完整文本内容。

 通过 CSS 选择器定位元素

  # 7. By CSS Selector - 定位百度logo
    logo_by_css_selector = driver.find_element(By.CSS_SELECTOR, "#lg > img")
    print("Located by CSS Selector: 百度Logo已找到")
  1. driver.find_element(By.CSS_SELECTOR, "#lg > img"):

    • 这行代码通过 CSS Selector 定位元素,使用的是 find_element 方法,它会返回页面中第一个符合条件的元素。
    • CSS Selector 是一种灵活且强大的方式,允许我们通过 CSS 规则定位元素。它支持多种选择器类型,包括 ID、类、标签、属性等。
    • 在这个例子中,#lg > img 表示选择 ID 为 lg 的元素下的 img 标签:
      • #lg:表示一个 ID 为 lg 的元素(ID 选择器)。
      • >:表示选择其直接子元素。
      • img:表示一个 img 标签(图像元素)。
    • 结合起来,这个选择器用于选择 ID 为 lg 的元素内的 img 元素(通常是百度主页上的 Logo 图片)。

总体代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 初始化 WebDriver
service = Service(executable_path="D:/Apython/chromedriver.exe")
driver = webdriver.Chrome(service=service)

# 打开百度主页
driver.get('https://www.baidu.com')

try:
    # 1. By ID - 定位搜索输入框
    search_box_by_id = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "kw"))
    )
    search_box_by_id.send_keys("Selenium")  # 在输入框中输入"Selenium"
    print("Located by ID:", search_box_by_id.get_attribute("value"))

    # 2. By Name - 定位搜索按钮
    # 定位搜索按钮(名称为wd),并点击按钮(百度按钮的ID实际为su,所以切换成用ID定位)。
    search_button_by_name = driver.find_element(By.NAME, "wd")
    search_button_by_name = driver.find_element(By.ID, "su")  # 百度搜索按钮的ID为 "su"
    search_button_by_name.click()
    print("Located by Name: 搜索按钮点击成功")

    # 3. By Class Name - 定位搜索输入框的父级容器
    parent_div_by_class_name = driver.find_element(By.CLASS_NAME, "s_form")
    print("Located by Class Name:", parent_div_by_class_name.get_attribute("class"))

    # 4. By Tag Name - 定位所有链接
    all_links_by_tag_name = driver.find_elements(By.TAG_NAME, "a")
    print(f"Located by Tag Name: 找到 {len(all_links_by_tag_name)} 个链接")

    # 5.使用XPath来进行定位元素 定位新闻
    # CSSSelector中的href属性值需要使用引号包围
    news_link_by_xpath = WebDriverWait(driver, 20).until(
        EC.presence_of_element_located(
            (By.XPATH, "//a[@href='http://news.baidu.com' and @class='mnav c-font-normal c-color-t']")
        )
    )

    # 6. By Partial Link Text - 定位部分文本包含"视频"的链接
    video_link_by_partial_link_text = driver.find_element(By.PARTIAL_LINK_TEXT, "视频")
    print("Located by Partial Link Text:", video_link_by_partial_link_text.text)

    # 7. By CSS Selector - 定位百度logo
    logo_by_css_selector = driver.find_element(By.CSS_SELECTOR, "#lg > img")
    print("Located by CSS Selector: 百度Logo已找到")

    # 8. By XPath - 定位搜索输入框
    search_box_by_xpath = driver.find_element(By.XPATH, "//input[@id='kw']")
    search_box_by_xpath.clear()  # 清空输入框内容
    search_box_by_xpath.send_keys("XPath 选择器")  # 再次输入
    print("Located by XPath:", search_box_by_xpath.get_attribute("value"))

except Exception as e:
    print("An error occurred:", str(e))

finally:
    # 关闭浏览器
    driver.quit()

等待页面加载完成

Selenium Webdriver 提供两种类型的waits - 隐式和显式。 显式等待会让WebDriver等待满足一定的条件以后再进一步的执行。 而隐式等待让Webdriver等待一定的时间后再才是查找某元素。

显式等待

在代码中定义等待一定条件发生后再进一步执行代码。

最糟糕的案例是使用time.sleep(),它将条件设置为等待一个确切的时间段。 这里有一些方便的方法让你只等待需要的时间。WebDriverWait结合ExpectedCondition 是实现的一种方式。

隐式等待

如果某些元素不是立即可用的,隐式等待是告诉WebDriver去等待一定的时间后去查找元素。 默认等待时间是0秒,一旦设置该值,隐式等待是设置该WebDriver的实例的生命周期。

eg,拿百度首页先在输入框输入Selenium之后,等待一会儿在跳转视频模块进行举例

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# 自定义等待类:等待元素具有特定的CSS类
class element_has_css_class(object):
    def __init__(self, locator, css_class):
        self.locator = locator
        self.css_class = css_class

    def __call__(self, driver):
        element = driver.find_element(*self.locator)
        if self.css_class in element.get_attribute("class"):
            return element
        else:
            return False

# 初始化Chrome WebDriver
driver = webdriver.Chrome()

try:
    # 访问百度首页
    driver.get("https://www.baidu.com")

    # 等待百度首页的搜索框加载并可点击
    search_box = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.ID, "kw"))
    )
    print("搜索框已加载并可点击")

    # 在搜索框中输入关键词并提交
    search_box.send_keys("Selenium")
    search_box.submit()

    # 等待搜索结果页面加载,并等待搜索结果元素加载完成
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "content_left"))
    )
    print("搜索结果页面已加载")

    # 通过CSS类检查搜索按钮是否加载完成并可点击
    # 使用自定的element_has_css_class  等待搜素按钮具备特定的CSS类  确保样式正确
    search_button = WebDriverWait(driver, 10).until(
        element_has_css_class((By.ID, "su"), "bg s_btn")
    )
    print("搜索按钮具备指定的CSS类")

    # 点击“新闻”链接,使用CSS Selector定位
    news_link = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.LINK_TEXT,"视频"))
    )
    news_link.click()
    print("已点击视频链接")

    # 等待新闻页面加载完成
    WebDriverWait(driver, 10).until(
        EC.title_contains("百度新闻")
    )
    print("百度新闻页面已加载")

    # 等待某个新闻板块可见
    news_section = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.CSS_SELECTOR, ".news-nav-item"))
    )
    print("新闻板块已加载")

    # 进一步操作,如点击具体的新闻标题等

finally:
    # 等待几秒后关闭浏览器
    time.sleep(20)
    driver.quit()

eg,获取百度页面的 title 和 URL,并使用句柄方式切换窗口的例子:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time

# 创建一个 WebDriver 实例
driver = webdriver.Chrome()

# 打开百度首页
driver.get("http://www.baidu.com")

# 获取当前窗口的句柄
current_window_handle = driver.current_window_handle

# 获取当前窗口的 title 和 URL
print("当前窗口的 title:", driver.title)
print("当前窗口的 URL:", driver.current_url)

# 点击百度首页上的 "新闻" 链接,打开一个新窗口
driver.find_element(By.LINK_TEXT, "新闻").click()

# 等待 2 秒,确保新窗口已经打开
time.sleep(2)

# 获取所有窗口的句柄
all_window_handles = driver.window_handles

# 遍历所有窗口的句柄
for window_handle in all_window_handles:
    # 如果当前窗口的句柄不是第一个窗口的句柄
    if window_handle != current_window_handle:
        # 切换到当前窗口
        driver.switch_to.window(window_handle)
        # 获取当前窗口的 title 和 URL
        print("当前窗口的 title:", driver.title)
        print("当前窗口的 URL:", driver.current_url)

# 关闭所有窗口
driver.quit()

页面对象

一个页面对象表示在你测试的WEB应用程序的用户界面上的区域。

使用页面对象模式的好处:

  • 创建可复用的代码以便于在多个测试用例间共享
  • 减少重复的代码量
  • 如果用户界面变化,只需要修改一处

项目目录结构:

pythonProject/

├── po/

│ ├── __init__.py # 初始化文件

│ ├── element.py # 页面元素封装

│ └── page.py # 页面对象类定义

├── tests/

│ ├── __init__.py # 初始化文件

│ └── test_search.py # 测试用例

└── requirements.txt # 依赖文件

 eg1:要自动化测试 Python 官方网站的搜索功能。具体步骤如下:

打开 Python 官网。

输入搜索关键字,例如 "pycon"。

点击搜索按钮。

验证搜索结果页面是否正确加载。

页面元素

po/element.py 中定义页面元素封装类

# 页面元素封装 包含基本的操作方法 例如查找元素、点击、发送文本等。
# 定位元素
from selenium.webdriver.common.by import By
# 处理页面加载时间不确定的情况,确保在操作元素之前它已经存在或可见。
from selenium.webdriver.support.ui import WebDriverWait
# expected_conditions (EC): 一个预定义的条件集,可以结合 WebDriverWait 使用。
# 例如,等待某个元素出现、可点击、页面标题包含某些内容等。
from selenium.webdriver.support import expected_conditions as EC

# 封装了对页面元素的基本操作 查找 点击和输入文本
class BaseElement:

    def __init__(self, driver, by, value):
        # 与浏览器的交互
        self.driver = driver
        # 元素的定位方式
        self.by = by
        # 元素的定位值
        self.value = value

    def find_element(self):
        # 等待最多10秒钟,直到满足条件。如果 10
        # 秒内条件未满足,会抛出超时异常。
        return WebDriverWait(self.driver, 10).until(
            EC.presence_of_element_located((self.by, self.value))
        )

    # 通过find_element方法找到元素,然后执行点击操作。
    def click(self):
        self.find_element().click()

    # 向页面上的输入框元素发送文本(例如输入搜索关键词)
    def send_keys(self, text):
        # 先通过find_element方法找到元素,然后将文本text输入到该元素中。
        self.find_element().send_keys(text)

页面对象类

po/page.py 中创建页面对象类

# 页面对象类定义 代表 Python 官网的首页以及搜索结果页面。
from po.element import BaseElement
from selenium.webdriver.common.by import By

# 封装了主页上的操作:输入搜索关键词和点击搜索按钮。
class PythonOrgHomePage:
    def __init__(self, driver):
        self.driver = driver
        # search_box和go_button:这两个是定位器,用于定位主页上的搜索框和搜索按钮。
        # BaseElement类封装了元素的查找和操作逻辑,By.NAME, "q"和By.ID, "submit"指定了如何定位这些元素。
        self.search_box = BaseElement(driver, By.NAME, "q")
        self.go_button = BaseElement(driver, By.ID, "submit")

    # 用于在搜索框中输入搜索词。 term: 要输入的搜索关键词。
    def enter_search_term(self, term):
        self.search_box.send_keys(term)

    # term: 要输入的搜索关键词。找到搜索按钮并执行点击操作。
    def click_go_button(self):
        self.go_button.click()

# 封装了搜索结果页面的验证逻辑。通过检查页面标题,它可以确定搜索是否成功。
class SearchResultsPage:
    def __init__(self, driver):
        self.driver = driver

    def is_result_found(self):
        print("Current page title:", self.driver.title)
        return "Search Python.org" in self.driver.title





测试用例

 tests/test_search.py 中编写测试用例

# 测试用例
import unittest
from selenium import webdriver
from po.page import PythonOrgHomePage, SearchResultsPage

class PythonOrgSearchTest(unittest.TestCase):
    # 在每个测试用例执行之前调用,用于初始化测试环境。
    def setUp(self):
        self.driver = webdriver.Chrome()  # 使用 Chrome 浏览器
        self.driver.get("https://www.python.org")

    def test_search_in_python_org(self):
        # 创建一个 PythonOrgHomePage实例,封装了主页上的操作。
        home_page = PythonOrgHomePage(self.driver)
        # 在搜索框中输入"pycon"
        home_page.enter_search_term("pycon")
        # 点击搜索按钮
        home_page.click_go_button()
        # 封装了搜索结果页面的操作。
        search_results_page = SearchResultsPage(self.driver)
        self.assertTrue(search_results_page.is_result_found())

    # 每个测试用例执行之后调用,用于清理测试环境。
    def tearDown(self):
        self.driver.quit()

if __name__ == "__main__":
    unittest.main()

eg2,使用 Selenium WebDriver 和 unittest 框架,测试百度搜索功能

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class BaiduHomePage:
    def __init__(self, driver):
        self.driver = driver
        # 元组,用于指定搜索框和搜索按钮的定位方式(ID)。
        self.search_box = (By.ID, "kw")
        self.search_button = (By.ID, "su")

    # 在搜索框中输入搜索词
    # 等待搜索框出现
    # 超时时间为10s
    # 向搜索框中输入搜索词
    def enter_search_term(self, term):
        WebDriverWait(self.driver, 10).until(EC.presence_of_element_located(self.search_box)).send_keys(term)
    # 点击搜索按钮
    # 等待搜索按钮可点击,超时时间为 10 秒
    # 等待条件,元素可点击
    # 点击搜索按钮
    def click_search_button(self):
        WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable(self.search_button)).click()

class BaiduSearchResultsPage:
    def __init__(self, driver):
        self.driver = driver

    # 用于检查搜索结果页面是否正确加载
    def is_result_found(self):
        return "百度一下,你就知道" in self.driver.title

test_baidu_search.py(测试用例)

import unittest
from selenium import webdriver
from page import BaiduHomePage, BaiduSearchResultsPage

class TestBaiduSearch(unittest.TestCase):
    # 在每个测试用例执行前执行一次,用于初始化测试环境。
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.get("https://www.baidu.com")

    def test_baidu_search(self):
        home_page = BaiduHomePage(self.driver)
        home_page.enter_search_term("Python")
        home_page.click_search_button()

        search_results_page = BaiduSearchResultsPage(self.driver)
        self.assertTrue(search_results_page.is_result_found())

    def tearDown(self):
        self.driver.quit()

if __name__ == "__main__":
    unittest.main()


 

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

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

相关文章

OpenCV运动分析和目标跟踪(3)计算图像序列的加权平均值函数accumulateWeighted()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 更新一个运行平均值。 该函数计算输入图像 src 和累积器 dst 的加权和&#xff0c;使得 dst 成为帧序列的运行平均值&#xff1a; dst ( x , y…

CANopen通讯协议笔记

CANopen通讯协议笔记 CANopen 通信对象编号CANopen整体框架网络管理&#xff08;NMT&#xff09;主要任务上线报文心跳报文过程数据对象&#xff08;PDO&#xff09;SDO服务数据对象对象字典概述 CANopen 通信对象编号 CANopen报文传输采用 CAN 标准帧格式。 这里的CAN-ID也叫…

ARM(Day 2)

一、作业 &#xff08;1&#xff09;汇编代码 .text.globl _start_start:mov r0, #0x5mov r1, #0x10比较r0,r1 是否相等 相等执行stop 不相等执行下一步比较&#xff08; r0 > r1 ?&#xff09;cmp r0, r1 比较实际在做减法 (YES NO )subhi r0, r0, r1 r0 > r1 …

浅谈Spring Cloud:OpenFeign

RestTemplate 方式调用存在的问题&#xff1a; String url "http://userservice/user/" order.getUserId(); User user restTemplate.getForObject(url, User.class); 这是通过URL地址来访问的。但是&#xff1a; 代码可读性差&#xff0c;编程体验不统一参数复…

NCNN 源码(1)-模型加载-数据预处理-模型推理

参考 ncnn 第一个版本的代码。 0 整体流程 demo&#xff1a;squeezenet ncnn 自带的一个经典 demo&#xff1a;squeezenet 的代码: // 网络加载 ncnn::Net squeezenet; squeezenet.load_param("squeezenet_v1.1.param"); squeezenet.load_model("squeezenet_…

对象关系映射ORM

目录 ORM【重要】 1、 什么是ORM 2、 实体类 3、 ORM改造登录案例 ORM【重要】 1、 什么是ORM 目前使用JDBC完成了CRUD,但是现在是进行CRUD,增删改方法要设计很多参数,查询的方法需要设计集合才能返回. 在实际开发中,我们需要将零散的数据封装到对象处理. ORM (Object Rela…

在曲线图上最值和极值点位置进行适当标注

1、首先生成一组0-100的随机数&#xff0c;组内共有100个数据&#xff1b; yyrandi([0,100],[1,100]); 2、求这组数据的功率谱密度&#xff0c;并绘图&#xff1b; msize(yy,2); xdft fft(yy); % 计算功率谱密度 psd (1/m) * abs(xdft).^2; x1:m; loglog(x,psd,Linewid…

恶意windows程序

Lab07-01.exe分析&#xff08;DOS攻击&#xff09; 1.当计算机重启后&#xff0c;这个程序如何确保它继续运行(达到持久化驻留)? 创建Malservice服务实现持久化 先分析sub_401040桉函数 尝试获取名为HGL345互斥量句柄&#xff0c;如果不存在则直接结束流程&#xff1b;如果存…

【设计模式】万字详解:深入掌握五大基础行为模式

作者&#xff1a;后端小肥肠 &#x1f347; 我写过的文章中的相关代码放到了gitee&#xff0c;地址&#xff1a;xfc-fdw-cloud: 公共解决方案 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; 【设计模式】&#xf…

主语部分、谓语部分、限定动词 (谓语动词) 和非限定动词 (非谓语动词)

主语部分、谓语部分、限定动词 {谓语动词} 和非限定动词 {非谓语动词} 1. 主语部分 (subject)1.1. Forms of the subject 2. 谓语部分 (predicate)2.1. Cambridge Dictionary2.2. Longman Dictionary of Contemporary English2.3. 谓语部分和谓语动词2.4. Traditional grammar …

240922-Ollama使用Embedding实现RAG

A. 最终效果 B. 文本分块代码 #%% from PyPDF2 import PdfReader from langchain.text_splitter import CharacterTextSplitterpdf_path 2023-LiuGuokai-Meas.pdf pdf_reader PdfReader(pdf_path) text "" for page in pdf_reader.pages:text page.extract_text…

2024年最新 Python 大数据网络爬虫技术基础案例详细教程(更新中)

网络爬虫概述 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;又称为网页蜘蛛&#xff08;Web Spider&#xff09;或网络机器人&#xff08;Web Robot&#xff09;&#xff0c;是一种自动化程序或脚本&#xff0c;用于浏览万维网&#xff08;World Wide Web&#xf…

(学习总结)STM32CubeMX HAL库 学习笔记撰写心得

STM32CubeMX学习笔记撰写心得 引言 在深入学习和实践STM32系列微控制器的开发过程中&#xff0c;我经历了从标准库到HAL库&#xff0c;再到结合STM32CubeMX进行项目开发的转变。这一过程中&#xff0c;我深刻体会到了STM32CubeMX在配置和代码生成方面的强大与便捷。为了检验自…

哈希简单介绍

1.直接定址法&#xff08;值的分布范围集中&#xff09; 比如统计字符串中字符出现的字数&#xff0c;字符范围是集中 2.除留余数法&#xff08;值的分布范围分散&#xff09; hashkey%n 哈希冲突&#xff1a;不同的值映射到相同的位置 解决哈希冲突的方案&#xff1a; 闭散…

抖音短视频矩阵系统OEM源码开发注意事项,功能开发细节流程全揭秘

抖音短视频矩阵系统OEM源码开发注意事项,功能开发细节流程全揭秘 在当今数字化时代背景下&#xff0c;短视频产业正经历前所未有的快速发展。其中&#xff0c;抖音凭借其创新的算法及多元内容生态获得巨大成功&#xff0c;吸引了众多用户。对于意欲进入短视频领域的创业者而言&…

【RocketMQ】一、基本概念

文章目录 1、举例2、MQ异步通信3、背景4、Rocket MQ 角色概述4.1 主题4.2 队列4.3 消息4.4 生产者4.5 消费者分组4.6 消费者4.7 订阅关系 5、消息传输模型5.1 点对点模型5.2 发布订阅模型 1、举例 以坐火车类比MQ&#xff1a; 安检大厅就像是一个系统的门面&#xff0c;接受来…

springboot地方特色美食分享系统-计算机毕业设计源码02383

摘要 本论文主要论述了如何使用SpringBoot技术开发一个地方特色美食分享系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述地方特色美食分享系统的当前背景以…

数据结构与算法——Java实现 8.习题——移除链表元素(值)

祝福你有前路坦途的好运&#xff0c;更祝愿你能保持内心光亮 纵有风雨&#xff0c;依然选择勇敢前行 —— 24.9.22 203. 移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示…

uniapp 微信小程序 订阅消息功能实现

该网址 https://api.weixin.qq.com 上线后不可访问&#xff0c;调用该网址操作需在后端&#xff08; 重要&#xff01; 重要&#xff01; 重要&#xff01;&#xff09; 1.首先拿到的三个码 //微信公众平台 //https://mp.weixin.qq.com const wxappid "管理-开发管理-A…

手机号归属地查询-运营商归属地查询-手机号归属地信息-运营商手机号归属地查询接口-手机号归属地

手机号归属地查询接口是一种网络服务接口&#xff0c;它允许开发者通过编程方式查询手机号码的注册地信息。这种接口通常由第三方服务提供商提供&#xff0c;并可通过HTTP请求进行调用。以下是一些关于手机号归属地查询接口的相关信息&#xff1a; 1. 接口功能 归属地查询&am…